給出長度為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...