BZOJ3629 JLOI2014 聰明的燕姿

2021-08-09 20:34:51 字數 1553 閱讀 3810

標籤:線性篩,dfs

description

陰天傍晚車窗外

未來有乙個人在等待

向左向右向前看

愛要拐幾個彎才來

我遇見誰會有怎樣的對白

我等的人他在多遠的未來

我聽見風來自地鐵和人海

我排著隊拿著愛的號碼牌

城市中人們總是拿著號碼牌,不停尋找,不斷匹配,可是誰也不知道自己等的那個人是誰。可是燕姿不一樣,燕姿知道自己等的人是誰,因為燕姿數學學得好!燕姿發現了乙個神奇的演算法:假設自己的號碼牌上寫著數字s,那麼自己等的人手上的號碼牌數字的所有正約數之和必定等於s。

所以燕姿總是拿著號碼牌在地鐵和人海找數字(喂!這樣真的靠譜嗎)可是她忙著唱《綠光》,想拜託你寫乙個程式能夠快速地找到所有自己等的人。

input

輸入包含k組資料(k<=100)對於每組資料,輸入包含乙個號碼牌s

output

對於每組資料,輸出有兩行,第一行包含乙個整數m,表示有m個等的人,第二行包含相應的m個數,表示所有等的人的號碼牌。注意:你輸出的號碼牌必須按照公升序排列。

sample input

42

sample output

3

20 26 41

hint

對於100%的資料,有s<=2*10*9

分析:

對於乙個數n,分為兩種情況討論

1.n-1為質數,那麼n-1存放答案的num陣列

2. 對於每乙個未被搜尋過且平方小於當前數的質數,則列舉所有可能符合題意的情況進行遞迴搜尋

時間複雜度並不是很會分析……

code

#include#include#include#include#define rep(i,a,b) for(int i=a;i<=b;i++)

using namespace std;

const int maxn=5e4;

int prime[maxn],cnt=0,ans,num[maxn],n;

bool not_prime[maxn];

void getprime() }}

bool isprime(int x)

void dfs(int last,int now,int tot)

if(tot-1>prime[last]&&isprime(tot-1))num[++ans]=now*(tot-1);

for(int i=last+1;prime[i]*prime[i]<=tot;i++)

for(int tnum=prime[i]+1,t=prime[i];tnum<=tot;t*=prime[i],tnum+=t)

if(tot%tnum==0)dfs(i,now*t,tot/tnum);

}int main()

return 0;

}

bzoj3629 JLOI2014 聰明的燕姿

搜尋。我們知道 如果 n prod limits p 其中 p 為質數,那麼n的約數和為 prod limits p p p 如 36 2 3 那麼 36 的約數和為 2 2 2 3 3 3 91 我們搜尋找到所有合法最小的 p 和它次數 k 然後dfs進入下一次搜尋中。如果發現當前的約數和為乙個質...

Bzoj3629 Jloi2014聰明的燕姿

蒟蒻不知道約數和公式。qaq 然後自己手玩出來了,但是沒去想dfs 反正這篇博文也只是記錄一下自己的愚蠢,就貼的是popoqqq神犇的 順便約數和公式 設n p1 k1 p2 k2.pn kn d sum n p1 0 p1 1 p1 k1 p2 0 p2 1 p2 k2 pn 0 pn 1 pn ...

bzoj3629 JLOI2014 聰明的燕姿

陰天傍晚車窗外 未來有乙個人在等待 向左向右向前看 愛要拐幾個彎才來 我遇見誰會有怎樣的對白 我等的人他在多遠的未來 我聽見風來自地鐵和人海 我排著隊拿著愛的號碼牌 城市中人們總是拿著號碼牌,不停尋找,不斷匹配,可是誰也不知道自己等的那個人是誰。可是燕姿不一樣,燕姿知道自己等的人是誰,因為燕姿數學學...