小q非常喜歡數學,但是他的口算能力非常弱。因此他找到了小t,給了小t乙個長度為n的正整數序列a1,a2,…,an,要求小t丟擲m個問題以訓練他的口算能力。
每個問題給出三個正整數l,r,d,小q需要通過口算快速判斷al×al+1×…×ar−1×ar是不是d的倍數。
小q迅速地回答了出來,但是小t並不知道正確答案是什麼,請寫乙個程式幫助小t計算這些問題的正確答案。
第一行包含乙個正整數t(1≤t≤10),表示測試資料的組數。
每組資料第一行包含兩個正整數n,m(1≤n,m≤100000),分別表示序列長度以及問題個數。
第二行包含n個正整數a1,a2,…,an(1≤ai≤100000),表示序列中的每個數。
接下來m行,每行三個正整數l,r,d(1≤l≤r≤n,1≤d≤100000),表示每個問題。
對於每個問題輸出一行,若是倍數,輸出yes,否則輸出no。
sample input
15 4
6 4 7 2 5
1 2 24
1 3 18
2 5 17
3 5 35
sample output
yesno
noyes
source
"位元組跳動杯"2018中國大學生程式設計競賽-女生專場
【題解】:1.某個數x能被y整除,就是將兩個數進行質因數分解,然後比較分解出每個質因數的個數,如果x的全部都小於等於y的,那麼x就能被y整除。
2.這裡的思路也是類似,把給出的一列數字逐個質因數分解,分解結果用vector< int > f來存,f【i】就表示能分解出質因數i的數有哪些。
3.因為質因數的陣列,是根據輸入逐個輸入的,所以儲存結果必然是有順序的,所以查詢l,r中有多少這個質因數就完全可以用二分法,這裡用的是stl裡面的lower_bound 和 upper_bound ,然後比較個數
4.注意:分解質因數的步驟除了列舉之外,還要單獨判斷是否已經被分解成為1了
5.注意儲存質因數的陣列要初始化
#include
using
namespace std;
const
int maxn=
100005
;vector<
int> f[maxn]
;//儲存分解的質因數
voidfj(
int id,
int x)}if
(x>1)
//注意特判
f[x]
.push_back
(id);}
intmain()
int n,m;
scanf
("%d%d"
,&n,
&m);
for(
int i=
0;i)for
(int i=
0;i(cnt)}}
if(d>1)
if(***==1)
printf
("no\n");
else
printf
("yes\n");
}}return0;
}
hdu 6287 口算訓練 質因數分解,二分查詢
給出長度為n n 1000000 的數列和m m 1000000 個詢問。每個詢問有三個正整數l,r,d,詢問 l,r 區間累乘是否為d的倍數 查詢之前先對數列進行質因數分解 記錄每乙個質數存在的下標,比如資料 2 4 8 16 9 12 那麼v 2 v 3 表示2和3在資料中出現的下標。那麼查詢 ...
質因數分解
題目16 將乙個正整數分解質因數。例如 輸入90,列印出90 2 3 3 5。程式分析 對n進行分解質因數,應先找到乙個最小的質數k,然後按下述步驟完 成 1 如果這個質數恰等於n,則說明分解質因數的過程已經結束,列印出即可。2 如果n k,但n能被k整除,則應列印出k的值,並用n除以k的商,作為新...
質因數分解
短除法 求乙個數分解質因數,要從最小的質數除起,一直除到結果為質數為止。分解質因數的算式的叫短除法 和除法的性質差不多,還可以用來求多個個數的公因式 求 最大公因數的一種方法,也可用來求 最小公倍數。求幾個數最大公因數 的方法,開始時用觀察比較的方法,即 先把每個數的因數找出來,然後再找出公因數,最...