zoukankan      html  css  js  c++  java
  • hdu5175 gcd 求约数

    题意:求满足条件GCD(N,M) = N XOR M的M的个数

    sol:和uva那题挺像的。若gcd(a,b)=a xor b=c,则b=a-c

    暴力枚举N的所有约数K,令M=NxorK,再判断gcd(N,M)是不是等于K。

    注意枚举约数时传统方法是O(N)的,会完蛋

    有个O(sqrt(N))的方法:

    注意一个性质:若n%i==0,则有n%(n/i)=0

    所以可以这样:

    for (int i=1;i*i<=N;i++)

      if (N%i==0)

      {

        //i是约数,N/i也是约数

        balabalabala...

      }

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <algorithm>
     4 #include <cmath>
     5 #include <vector>
     6 using namespace std;
     7 #define LL long long
     8 
     9 LL M,N;
    10 LL ans[100000];
    11 int TC=0;
    12 
    13 long long gcd(long long a,long long b){
    14     if(b == 0)return a;
    15     return gcd(b,a%b);
    16 }
    17 
    18 int main()
    19 {
    20     while (~scanf("%I64d",&N))
    21     {
    22         vector<LL> ans;
    23         TC++;
    24         int num=0;
    25 
    26         //calculate all factors of N
    27 /*
    28         for (int c=1;c<=N-1;c++)
    29             if (N%c==0)
    30             {
    31                 M=N-c;
    32                 num++;
    33                 printf("%d  %I64d
    ",num,M);
    34                 ans[num]=M;
    35             }
    36 */
    37 /*
    38         LL m=sqrt(N)+0.5;
    39         for (LL i=1; i<m; i++)
    40             if ( !(N%i) )
    41             {
    42                 M=N-i;
    43                 num++;
    44                 ans[num]=M;
    45             }
    46         for (LL i=m; i>1; i--)   //Шєn%i==0,дђгаn%(n/i)=0.
    47             if ( !(N%i) )
    48             {
    49                 M=N-(N/i);
    50                 num++;
    51                 ans[num]=M;
    52             }
    53         if (N==2)
    54         {    num++;     ans[num]=1;   }
    55 */
    56 
    57         for (LL i=1;i*i<=N;i++) //若n%i==0,则有n%(n/i)=0
    58             if (N%i==0)         //i , n/i
    59             {
    60                 if(gcd(N,N^i) == i && (N^i) >= 1 && (N^i) <= N)
    61                     ans.push_back(N^i);
    62                 if(i*i < N && gcd(N,N^(N/i)) == N/i && (N^(N/i)) >= 1 && (N^(N/i)) <= N)
    63                     ans.push_back(N^(N/i));
    64 
    65                 //LL M1=N-i,M2=N-(N/i);
    66                 //if (gcd(N,M1)==N^M1)              ans.push_back(M1);
    67                 //if (M1!=M2 && gcd(N,M2)=和=N^M2)    ans.push_back(M2);
    68             }
    69 
    70         sort(ans.begin(),ans.end());
    71         printf("Case #%d:
    ",TC);
    72         printf("%d
    ",ans.size());
    73         for (int i=0;i<ans.size();i++)
    74         {
    75             if (i>0)    printf(" ");
    76             printf("%I64d",ans[i]);
    77         }
    78         printf("
    ");
    79     }
    80 
    81     return 0;
    82 }
    View Code
  • 相关阅读:
    Spring_7_AOP之Advice应用
    JAVA豆知识
    SPRING事务_2
    JSP_5_JavaBean
    Spring事务_1
    java基本类型和包装类型
    SVN使用教程总结
    通过反射来创建对象?getConstructor()和getDeclaredConstructor()区别?
    Java泛型中extends和super的区别?
    数字签名、数字证书、对称加密算法、非对称加密算法、单向加密(散列算法)
  • 原文地址:https://www.cnblogs.com/pdev/p/4311969.html
Copyright © 2011-2022 走看看