题意:求0到N-1中,有多少数m满足gcd(N,m)=N^m
思路点击打开链接:令M = N xor K,原式:gcd(N,N xor K) == N xor (N xor K) == K
由此我们可以发现K是N的约数,找到所有N的约数,判断是不是满足那个等式即可,因为是异或运算,结果可能比约
数本身大,如1xor2==3,还有异或出来结果等于0的舍掉,gcd(n,n) != n xor n。
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn = 1e5+5;
ll yz[maxn], ans[maxn];
int main(void)
{
int ca = 1;
ll n;
while(cin >> n)
{
int cnt1 = 0;
for(int i = 1; i <= (ll)sqrt(n); i++)
{
if(n%i == 0)
{
yz[cnt1++] = i;
yz[cnt1++] = n/i;
}
}
int cnt2 = 0;
for(int i = 0; i < cnt1; i++)
{
ll m = yz[i]^n;
if(m && __gcd(m, n) == yz[i] && m <= n)
ans[cnt2++] = m;
}
printf("Case #%d:\n", ca++);
printf("%d\n", cnt2);
sort(ans, ans+cnt2);
for(int i = 0; i < cnt2; i++)
{
if(i) printf(" ");
printf("%lld", ans[i]);
}
puts("");
}
return 0;
}