HDU 6287 口算訓練 二分 思維

2021-08-20 09:26:57 字數 1001 閱讀 1877

題意:給你n個數,和m個詢問,每個詢問有乙個l和r和d,現在問你,從【l,r】區間的乘積是不是d的倍數。

思路:對於乙個數(k)是不是d的倍數這類問題,我們可以對這兩個數分解質因數,之後看看k的質因數和d的質因數之間的關係,如果滿足對於d的每乙個質因數個數,在k中都有出現過,且k的出現次數要大於等於d的出現次數,這個就是滿足的,舉個例子,36 和 6 ,36的質因數有 2,2,3,3,6的質因數有 2,3,其中36中2出現的次數大於了6中2出現的次數,36中3出現的次數大於了6中3出現的次數,故36是6的倍數,那麼對於這道題,我們需要做的就是先將這n個數分解質因數,對於區間問題我們要怎麼解決呢?我們把質因數出現的位置給存下來,比如說我們現在在第3個數,a[3] = 8 ,那麼我們開乙個vector g[2]裡加入 3,3,3,3,之後,之後比如說我們現在要查詢l,r的區間是不是d的倍數,我們將d分解質因數之後用二分去查詢我們當前的區間裡有沒有這個值就好了,上**把,**比較清晰

**:

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

const int maxn = 100000+10;

int cnt ;

vectorg[maxn];

void p(int id,int x)

} if(x>1) // 這裡有乙個問題就是 我sqrt(maxn)裡的最大的質數其實是313,那麼我來了乙個2 * 313的時候,我們找到的質因數只有2 ,所以當他沒有到1的時候說明我們沒有完 }

int main()

while(m--)

if(cnt)}}

if(p>1) //同理

if(flag) puts("no");

else puts("yes");

} }}/*

53 3

634 319

31 1 317

1 2 3

1 3 3

*/

hdu6287 口算訓練 思維 篩 二分

給你n個數,a,m個詢問,每次詢問l,r,d 問 l,r 的乘積,是不是d的倍數 錢神和之前做的乙個篩的題很像,就再總結一下吧 先都分解質因數,然後對於數ai,ans ai的質因數q 內放入位置i 注意相同的質因數得重複放入 然後對於d的每個質因數p,二分查詢ans p 內 l,r 的數有多少,如果...

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