hdu 6287 口算訓練 質因數分解,二分查詢

2021-08-21 16:06:37 字數 1029 閱讀 8275

給出長度為n(n<=1000000)的數列和m(m<=1000000)個詢問。

每個詢問有三個正整數l,r,d,詢問[l,r]區間累乘是否為d的倍數

查詢之前先對數列進行質因數分解

記錄每乙個質數存在的下標,比如資料:2 4 8 16 9 12

那麼v[2]=; v[3]=;

表示2和3在資料中出現的下標。

那麼查詢[l,r]=[2,4]中, 有2的多少次方的操作:

upper_bound(v[2].begin(),v[2].end(),r)-lower_bound(v[2].begin(),v[2].end(),l)

答案是9,表示l到r之間最多能夠組成2的9次方;

對每個詢問中的數d進行質因數分解,再逐個質因數進行查詢即可解決。

對某個數進行質因數分解時,分解過程中若d除后為質數,則跳出迴圈,不然會卡時間

#include#include#include#include#include#include#include#include#include#include#include#include#include#define inf 0x3f3f3f3f//3f3f3f3f

#define lowbit(a) ((a)&(-(a)))

using namespace std;

typedef long long ll;

typedef pairp;

int n,m,a,l,r,d;

vectorv[100005];

int p[100005],np[100005],pcnt;

void primediv(int n)

for(int j=0;j1)v[a].push_back(k);//important!

}int main()

if(flag)printf("yes\n");

else printf("no\n");}}

return 0;

}

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...