zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    数全排列问题
    DNA repair问题
    分治问题
    贪心问题
    STL简单应用问题
    求一个数阶乘后位数问题
    《DSP using MATLAB》Problem 2.6
    《DSP using MATLAB》示例Example 10.4
    《DSP using MATLAB》Problem 2.5
    《DSP using MATLAB》Problem 2.4
  • 原文地址:https://www.cnblogs.com/Tokisaki-Kurumi/p/9477905.html
Copyright © 2011-2022 走看看