hdu 口算訓練 二分 質因數分解

2021-10-09 17:53:07 字數 1652 閱讀 3438

小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的商,作為新...

質因數分解

短除法 求乙個數分解質因數,要從最小的質數除起,一直除到結果為質數為止。分解質因數的算式的叫短除法 和除法的性質差不多,還可以用來求多個個數的公因式 求 最大公因數的一種方法,也可用來求 最小公倍數。求幾個數最大公因數 的方法,開始時用觀察比較的方法,即 先把每個數的因數找出來,然後再找出公因數,最...