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

 

 

 

转载于:https://www.cnblogs.com/Tokisaki-Kurumi/p/9477905.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值