http://acm.hdu.edu.cn/showproblem.php?pid=5175
给一个大数n,1e10的范围
求1~n里有多少个数m满足gcd(m,n)==m^n(异或)
好思路。。看的题解。。
设m=n^x
原式子变为gcd(n^x,n)==x
那么x一定是n的因子,所以直接根n枚举n的因子即可
#include<bits/stdc++.h>
using namespace std;
long long ans[200000];
int main()
{
long long n,i,tca=1;
while(~scanf("%lld",&n))
{
int j=0;
printf("Case #%lld:\n",tca++);
for(i=1;i*i<=n;i++)
{
if(n%i==0)
{
if(__gcd(n,n^i)==i)
{
long long t1=i^n;
if(t1>0&&t1<n)
ans[j++]=t1;
}
long long temp=n/i;
if(temp!=i)
{
if(__gcd(n,n^temp)==temp)
{
long long t1=temp^n;
if(t1>0&&t1<n)
ans[j++]=t1;
}
}
}
}
printf("%d\n",j);
sort(ans,ans+j);
for(i=0;i<j;i++)
{
printf("%lld",ans[i]);
if(i!=j-1)
printf(" ");
}
printf("\n");
}
return 0;
}