国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

bzoj 3629: [JLOI2014]聰明的燕姿 (dfs+線性篩)

2019-11-08 20:06:19
字體:
來源:轉載
供稿:網友

3629: [JLOI2014]聰明的燕姿

Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1135  Solved: 406[Submit][Status][Discuss]

Description

陰天傍晚車窗外未來有一個人在等待向左向右向前看愛要拐幾個彎才來我遇見誰會有怎樣的對白我等的人他在多遠的未來我聽見風來自地鐵和人海我排著隊拿著愛的號碼牌城市中人們總是拿著號碼牌,不停尋找,不斷匹配,可是誰也不知道自己等的那個人是誰。可是燕姿不一樣,燕姿知道自己等的人是誰,因為燕姿數學學得好!燕姿發現了一個神奇的算法:假設自己的號碼牌上寫著數字S,那么自己等的人手上的號碼牌數字的所有正約數之和必定等于S。所以燕姿總是拿著號碼牌在地鐵和人海找數字(喂!這樣真的靠譜嗎)可是她忙著唱《綠光》,想拜托你寫一個程序能夠快速地找到所有自己等的人。

Input

輸入包含k組數據(k<=100)對于每組數據,輸入包含一個號碼牌S

Output

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

Sample Input

42

Sample Output

320 26 41

HINT

對于100%的數據,有S<=2*10*9

Source

[Submit][Status][Discuss]

題解:dfs+線性篩

需要用到約數和公式:F(n)=∏(1<=i<=k)[pi^(qi+1)-1)/(pi-1)]

然后對于sqrt(s)以內的素數枚舉,大于sqrt(s)之間判斷,dfs的時候加一些減值和特判即可。

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#define N 100003#define LL long longusing namespace std;int PRime[N],pd[N],n,ans[N],cnt,m;void init(){	for (int i=2;i<=100000;i++) {		if (!pd[i]) prime[++prime[0]]=i;		for (int j=1;j<=prime[0];j++) {			if (prime[j]*i>100000) break;			pd[prime[j]*i]=1;			if (i%prime[j]==0) break;		}	}}bool check(int x){	for (int i=2;i*i<=x;i++) 	 if (x%i==0) return false;	return true;}void dfs(int x,int sum,int num){	if (sum>m&&check(sum-1)) 	 ans[++ans[0]]=num*(sum-1);	if (sum<0) return;	if (sum==1) {		ans[++ans[0]]=num;		return;	}  	int t=num; LL sum1=sum; 	for (int i=x;i<=prime[0];i++) {		if (sum<prime[i]) break;		LL pri=prime[i];		while (true) {			sum1=((LL)pri*prime[i]-1)/(LL)(prime[i]-1);			if (sum%sum1==0) dfs(i+1,sum/sum1,num*pri);			if (sum/sum1<prime[i]) break;			pri*=(LL)prime[i];		}	}}int main(){	freopen("a.in","r",stdin);	freopen("my.out","w",stdout);	init();	while (scanf("%d",&n)!=EOF) {		cnt=0; ans[0]=0; m=ceil(sqrt(n));		dfs(1,n,1);		sort(ans+1,ans+ans[0]+1);		ans[0]=unique(ans+1,ans+ans[0]+1)-ans-1;		printf("%d/n",ans[0]);		for (int i=1;i<ans[0];i++) printf("%d ",ans[i]);		if(ans[0]) printf("%d/n",ans[ans[0]]);	}}


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 石棉县| 汝南县| 天祝| 许昌县| 高淳县| 封开县| 龙州县| 兴宁市| 珠海市| 旌德县| 无锡市| 镇康县| 合作市| 彭州市| 南川市| 辉县市| 峨眉山市| 宜宾市| 临泉县| 西青区| 简阳市| 河北省| 安乡县| 历史| 望奎县| 青川县| 合水县| 阿图什市| 蛟河市| 辉县市| 镇宁| 库车县| 道孚县| 胶州市| 牟定县| 西乌珠穆沁旗| 青州市| 安徽省| 湖州市| 县级市| 镇雄县|