題意:
小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 #include3 #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 ...