小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
1sample output5 46 4 7 2 5
1 2 24
1 3 18
2 5 17
3 5 35
yes思路:樸素的想法對n個數分解質因子分別維護字首和,但是100000範圍素數有點多時間不允許,容易發現每個數》sqrt(100000)的質因子至多有乙個,那麼單獨處理這乙個就行了,可以用莫隊維護或者二分。nono
yes
# 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...