JZOJ5773 简单数学题

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 }
View Code

 

 

 

posted @ 2018-08-14 21:08  kasiruto  阅读(102)  评论(0编辑  收藏