口算訓練 (質數的分解 乙個不知道名的演算法)

2021-08-20 11:48:59 字數 1523 閱讀 7808

小q非常喜歡數學,但是他的口算能力非常弱。因此他找到了小t,給了小t乙個長度為

n的正整數序列a1

,a2,

...,

an,要求小t丟擲

m個問題以訓練他的口算能力。

每個問題給出三個正整數l,

r,d,小q需要通過口算快速判斷al

×al+

1×..

.×ar

−1×a

r是不是

d的倍數。

小q迅速地回答了出來,但是小t並不知道正確答案是什麼,請寫乙個程式幫助小t計算這些問題的正確答案。

input 第一行包含乙個正整數 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

),表示每個問題。 output 對於每個問題輸出一行,若是倍數,輸出yes,否則輸出no。 sample input

1

5 46 4 7 2 5

1 2 24

1 3 18

2 5 17

3 5 35

sample output
yes

nono

yes

思路:如果直接從l到r進行取餘計算會超時。

為了防止爆空間使用動態陣列vectormaze[i]進行儲存,其中動態陣列的下標表示質因子,

陣列中儲存的數表示,a1~an之間具有這個質因子的下標。然後二分從d分解出來的素數在

該區間內出現總次數是否大於它在d中的次數。

**實現如下:

#include#include#include#includeusing namespace std;

vectormaze[100010];

int panduan(int l, int r, int x) //不懂這個原理,結果就是l~r之間每個數因子是x的總個數

int panduan1(int l,int r,int x)

if(countt>panduan(l,r,i))

return 0;}}

if(x>1)

return 1;

}int main()

//必須對動態陣列進行清零處理,不然wa

for(i=1;i<=n;i++)}}

if(x>1)

maze[x].push_back(i); //最後剩餘的素數不要忘記

}while(m--)

}return 0;

}

乙個不知道是誰的經驗

下面是我當年學習.net的過程,和大家分享一下.1.決定使用c 進行.net的開發.2.費勁千辛萬苦,終於安裝上了vs2003 3.照著圖書館借來的書,完成了第乙個console程式 hello world 4.照著一本把asp.net當asp教的書,完成了一些簡單的頁面 5.照著一本介紹 資料庫操...

Vue 元件你不知道的乙個細節

在h5的table中,什麼元素可以出現在其內部是嚴格定義的,比如我們想要中有,中有.而不是中有個其他不該屬於的標籤,比如自己定義乙個元件,裡面模板還是.這樣會失敗!我們來看看最先會遇到什麼問題,如下 執行結果 這個可不是我們想要的,儘管能夠顯示結果,但是我的row元件明明寫在裡面,為什麼出現在了外面...

他從不知道我需要乙個擁抱

他從不知道我需要乙個擁抱 我知道我並不完美,我犯了一些錯,傷害了一些人,但是當我說 對不起 的時候,我是認真的 他從不知道我需要乙個擁抱!我最怕在我想要放棄的時候你又對我微笑 我最怕在我想要放棄的時候你又對我微笑 我好羨慕她 連她說謊的方式你都愛 經歷告訴你太過在乎就是失去的開始 不要因為沒有掌聲而...