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 }
posted on 2015-03-03 21:32 Pentium.Labs 阅读(160) 评论(0) 编辑 收藏 举报
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步