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

2021-08-20 10:05:20 字數 1618 閱讀 3548

小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×...×ar−1×ar

是不是 d

d的倍數。 

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

input第一行包含乙個正整數t(

1≤t≤

10)t(1≤t≤10)

,表示測試資料的組數。 

每組資料第一行包含兩個正整數n,

m(1≤

n,m≤

100000

)n,m(1≤n,m≤100000)

,分別表示序列長度以及問題個數。 

第二行包含nn

個正整數a1

,a2,

...,

an(1

≤ai≤

100000

)a1,a2,...,an(1≤ai≤100000)

,表示序列中的每個數。 

接下來m

m行,每行三個正整數l,

r,d(

1≤l≤

r≤n,

1≤d≤

100000

)l,r,d(1≤l≤r≤n,1≤d≤100000)

,表示每個問題。output對於每個問題輸出一行,若是倍數,輸出yes,否則輸出no。sample input

1

5 46 4 7 2 5

1 2 24

1 3 18

2 5 17

3 5 35

sample output
yes

nono

yes

思路:樸素的想法對n個數分解質因子分別維護字首和,但是100000範圍素數有點多時間不允許,容易發現每個數》sqrt(100000)的質因子至多有乙個,那麼單獨處理這乙個就行了,可以用莫隊維護或者二分。

# include # include # include # include using namespace std;

typedef long long ll;

const int maxn = 1e5+30;

int p[maxn], cnt=0, vis[maxn], tot[maxn]=, len;

int a[maxn], val[maxn], sum[maxn][66], id[maxn];

int ans[maxn];

inline void scan(int &ret)

void init()

}}struct node

node(int l, int r, int fk, int id):l(l),r(r),fk(fk), id(id)

bool operator <(const node b) const

while(r>r)

while(l

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迅速地回...

hdu 6287 口算訓練

題意 小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 a...