hdu 6287 口算訓練

2022-05-07 03:54:11 字數 1692 閱讀 3502

題意:

小q非常喜歡數學,但是他的口算能力非常弱。因此他找到了小t,給了小t乙個長度為n

'>n

n的正整數序列a1,

a2,.

..,a

n'>a1,a2,...,an

a1,a2,...,an,要求小t丟擲m

'>m

m個問題以訓練他的口算能力。 

每個問題給出三個正整數l,r

,d'>l,r,d

l,r,d,小q需要通過口算快速判斷al×

al+1

×...

×ar−

1×ar

'>al×al+1×...×ar−1×ar

al×al+1×...×ar−1×ar是不是d

'>d

d的倍數。 

小q迅速地回答了出來,但是小t並不知道正確答案是什麼,請寫乙個程式幫助小t計算這些問題的正確答案。

思路:一開始bit套map 用字首和處理,tle了?

對於每乙個輸入的數字,分解質因子,對於每乙個質因子,把這個數字的位置push到這個質因子的vector裡面去。

那麼每乙個vector裡面的數字就是非遞減的了。

然後對於每乙個輸入的l,r,d,把d分解質因子,對於每乙個質因子,在這個質因子的vector裡面找第乙個大於等於l的位置和最後乙個小於等於r的位置,相減,比較是否有d中這個質因子的數量多。

找的時候當然利用前面的非遞減,所以可以二分。

**:

1 #include 2 #include 

3 #include 4 #include 5

using

namespace

std;

6const

int n = 1e5 + 10;7

8 vectorp;

9 vectorg[n],g[n];

10bool

pp[n];

11int

a[n];

12int

n,m;

1314

intmain()

1526}27

}28intt;

29 scanf("

%d",&t);

30while (t--)

3137

for (int i = 1;i <= n;i++)

3847

for (int j = 0;j < g[x].size();j++)

4857}58

}59while (m--)

6068

if (!pp[d])

6976

else

7789

int x = lower_bound(g[v].begin(),g[v].end(),l) -g[v].begin();

90int y = upper_bound(g[v].begin(),g[v].end(),r) -g[v].begin();

91 y--;

92if (y - x + 1

< cnt) f = 1;93

if (f) break;94

}95if (f) puts("no"

);96

else puts("

yes"

);97}98

}99}100

return0;

101 }

HDU 6287 口算訓練

小q非常喜歡數學,但是他的口算能力非常弱。因此他找到了小t,給了小t乙個長度為n的正整數序列a1,a2,an,要求小t丟擲m個問題以訓練他的口算能力。每個問題給出三個正整數l,r,d,小q需要通過口算快速判斷al al 1 ar 1 ar是不是d的倍數。小q迅速地回答了出來,但是小t並不知道正確答案...

HDU 6287 口算訓練

小q非常喜歡數學,但是他的口算能力非常弱。因此他找到了小t,給了小t乙個長度為n的正整數序列a1,a2,an,要求小t丟擲m個問題以訓練他的口算能力。每個問題給出三個正整數l,r,d小q需要通過口算快速判斷al al 1 ar 1 a r al al 1 ar 1 ar 是不是d的倍數。小q迅速地回...

HDU6287 口算訓練(莫隊演算法)

小q非常喜歡數學,但是他的口算能力非常弱。因此他找到了小t,給了小t乙個長度為 nn 的正整數序列 a1 a2,ana1,a2,an 要求小t丟擲 mm 個問題以訓練他的口算能力。每個問題給出三個正整數 l,r,dl,r,d 小q需要通過口算快速判斷 al al 1 ar 1 a ral al 1 ...