escription
话说, 小X是个数学大佬,他喜欢做数学题。有一天,小X想考一考小Y。他问了小Y一道数学题。题目如下:
对于一个正整数N,存在一个正整数T(0<T<N),使得
的值是正整数。
小X给出N,让小Y给出所有可能的T。如果小Y不回答这个神奇的大佬的简单数学题,他学神的形象就会支离破碎。所以小Y求你帮他回答小X的问题。
Input
一个整数N。
Output
第一个数M,表示对于正整数N,存在M个不同的正整数T,使得
是整数。
后面是M个数,每一个数代表可能的正整数T(按从小到大的顺序排列)。
Sample Input
Sample Input1: 1 Sample Input2: 3 Sample Input3 180
Sample Output
Sample Output 0 Sample Output 1 2 Sample Output 5 120 144 160 168 176
Data Constraint
对于5%的数据,N=1.
对于20%的数据,N<=5.
对于40%的数据,N<=1000000
对于另外20%的数据,答案只有1个,且N为质数,保证对于前60%的数据,当N为质数的时候,答案都一定只有一个,对于这20%的数据,满足2<N。
对于80%的数据,N<=10^9.
对于100%的数据,N<=10^14.
Solution
经过变式之后原式变成了,我们要使的K是一个正整数,那么我们只需要让2K-1是N的因数。算出所有的因数,然后排一个序,输出就可以了。
1 #include<cstdio> 2 #include<cmath> 3 #include<algorithm> 4 using namespace std; 5 int m,l; 6 long long n,d[10000]; 7 int main() 8 { 9 scanf("%lld",&n); 10 for (int i=1;i<=(int)sqrt((double)n);i++) 11 if (n%i==0) 12 { 13 if (i%2!=0&&i!=1) 14 d[++l]=i; 15 if ((n/i)%2!=0&&(n/i)!=1) 16 d[++l]=n/i; 17 } 18 printf("%d ",l); 19 sort(d+1,d+l+1); 20 for (int i=1;i<=l;i++) 21 { 22 long long r=n/d[i]; 23 r=r*(d[i]-1); 24 printf("%lld ",r); 25 } 26 }
原文地址:https://www.cnblogs.com/Tokisaki-Kurumi/p/9477905.html
时间: 2024-11-05 06:28:21