题目描述
阴天傍晚车窗外
未来有一个人在等待
向左向右向前看
爱要拐几个弯才来
我遇见谁会有怎样的对白
我等的人他在多远的未来
我听见风来自地铁和人海
我排着队拿着爱的号码牌
城市中人们总是拿着号码牌,不停寻找,不断匹配,可是谁也不知道自己等的那个人是谁。可是燕姿不一样,燕姿知道自己等的人是谁,因为燕姿数学学得好!燕姿发现了一个神奇的算法:假设自己的号码牌上写着数字S,那么自己等的人手上的号码牌数字的所有正约数之和必定等于S。
所以燕姿总是拿着号码牌在地铁和人海找数字(喂!这样真的靠谱吗)可是她忙着唱《绿光》,想拜托你写一个程序能够快速地找到所有自己等的人。
输入
输入包含k组数据(k<=100)
输出
对于每组数据,输出有两行,第一行包含一个整数m,表示有m个等的人,第二行包含相应的m个数,表示所有等的人的号码牌。注意:你输出的号码牌必须按照升序排列。
样例输入
42
样例输出
320 26 41
提示
对于100%的数据,有S<=2*10*9
题解
一道显而易见的数学题,显而易见地我不会做。因为根本这个正解要用到的约数定理、约数和定理。唯一分解定理我都没学过,如果知道这些结论的话有没有推出答案的数学能力也未必。 唯一分解定理: 任何一个大于1的自然数N,都可以唯一分解成有限个质数的乘积N=P1^a1*P2^a2*…*Pn^an,这里P1<…
#include#include #include #include #define ll long longusing namespace std;const int sj=100100;ll s,m,ps,p[10000],res[sj],ge;bool fp[sj]={ 1,1};void xxs(){ for(int i=2;i<100000;i++) { if(!fp[i]) { ps++; p[ps]=i; } for(int j=1;j<=ps&&i*p[j] p[l]&&pss(yu-1)) { ge++; res[ge]=(yu-1)*ji; } for(int i=l+1;p[i]*p[i]<=yu;i++) { temp=1; f=1; for(int j=1;temp<=yu;j++) { f*=p[i]; temp+=f; if((yu%temp)==0) dfs(i,ji*f,yu/temp); } }}void cz(){ while(scanf("%lld",&s)==1) { memset(res,0,sizeof(res)); ge=0; dfs(0,1,s); if(ge!=0) { sort(res+1,res+ge+1,less ()); printf("%lld\n",ge); for(int i=1;i