Pentium.Labs

System全家桶:https://zhuanlan.zhihu.com/c_1238468913098731520

导航

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\n",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:\n",TC);
72         printf("%d\n",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("\n");
79     }
80 
81     return 0;
82 }
View Code

 

posted on 2015-03-03 21:32  Pentium.Labs  阅读(158)  评论(0编辑  收藏  举报



Pentium.Lab Since 1998