题意:输入n,a,令m = 2^n,问b取[1,m],问有多少个这样的b使(a^b)%m=(b^a)%m.
思路:找规律发现当a为奇数的时候,答案恒为1,当a为偶数,a^b为偶数,为使b^a为偶数,b也必须为偶数.
因为n比较小,所以当b小于等于n的时候可以暴力判断,当b> n,(a^b)%m恒为0,所以我们想使(b^a)%m也为0.
因为m = 2^n,所以b^a应为m的倍数,所以b应为2^(n/a)的倍数,此处上取整.所以我们只需算一下m是2^(n/a)的多少倍即可.当然还得减去<= n范围内重复的数量.
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,a,b,mod;
ll ksm(ll x,ll y){
ll ans=1;
while(y){
if(y&1)
ans=ans*x%mod;
y>>=1;
x=x*x%mod;
}
return ans;
}
int main(){
while(~scanf("%lld%lld",&n,&a)){
if(a&1){
puts("1");
continue;
}
mod=1<<n;
ll ans=0;
for(ll i=2;i<=n;i+=2)
if(ksm(a,i)==ksm(i,a))
ans++;
ll tmp=(n+a-1)/a;
tmp=1<<tmp;
ans+=(mod/tmp-n/tmp);
printf("%lld\n",ans);
}
}