Description
给出两正整数a,na,n,令m=2nm=2n,对于任意b∈[1,m]b∈[1,m],求满足ab≡ba(mod m)ab≡ba(mod m)的bb的个数
Input
多组用例,每组用例输入两正整数
Output
对于每组用例,输出满足方程的bb的个数
Sample Input
2 3
2 2
Sample Output
1
2
Solution
若为奇数,则ab mod mab mod m为奇数,若bb为偶数,则为偶数,矛盾,故bb为奇数
对于一个奇数,x2=4k2+4k+1=4k(k+1)+1x2=4k2+4k+1=4k(k+1)+1,进而x2≡1(mod 23)x2≡1(mod 23),x2=8k+1x2=8k+1,x4=(8k+1)2=64k2+16k+1x4=(8k+1)2=64k2+16k+1,进而x4≡1(mod 24)x4≡1(mod 24),以此类推有x2y≡1(mod 2y+2)x2y≡1(mod 2y+2)
由ab≡a(mod 23),ba≡b(mod 23)ab≡a(mod 23),ba≡b(mod 23)得a≡b(mod 23)a≡b(mod 23)
由ab≡ab%4(mod 24),ba≡ba%4(mod 24)ab≡ab%4(mod 24),ba≡ba%4(mod 24),且a%4=b%4a%4=b%4,故有a≡b(mod 24)a≡b(mod 24)
((b,24)=1(b,24)=1,故bb在模意义下有逆元b−1b−1,进而有(ab−1)x≡1(mod 24)(ab−1)x≡1(mod 24),其中x=a%4x=a%4为奇数,由于x/|ϕ(24)=23x⧸|ϕ(24)=23,故有ab−1≡1(mod 24)ab−1≡1(mod 24),即a≡b(mod 24)a≡b(mod 24))
以此类推得a≡b(mod 2n)a≡b(mod 2n),即b=a%mb=a%m,这说明解至多一个,而显然aa≡aa(mod m)aa≡aa(mod m),故解唯一
若aa为偶数,同理可证明为偶数,由于ab≡2b⋅(a2)b(mod 2n)ab≡2b⋅(a2)b(mod 2n),故当b>nb>n时,ab≡0(mod 2n)ab≡0(mod 2n),进而ba≡0(mod 2n)ba≡0(mod 2n),对于任意b∈[1,m]b∈[1,m],将bb表示为,其中cc为奇数,那么有,此式等价于ax≥nax≥n,故x≥⌈na⌉x≥⌈na⌉,令x=⌈na⌉x=⌈na⌉,此时区间(n,m](n,m]内满足2x|b2x|b的bb有个,当b≤nb≤n时,由于n≤30n≤30,暴力枚举bb判方程是否成立即可
Code
#include<cstdio>
using namespace std;
typedef long long ll;
int mod_pow(int a,int b,int c)
{
int ans=1;
while(b)
{
if(b&1)ans=(ll)ans*a%c;
a=(ll)a*a%c;
b>>=1;
}
return ans;
}
int main()
{
int n,a;
while(~scanf("%d%d",&n,&a))
{
int m=1<<n;
if(a&1)printf("1\n");
else
{
int ans=0;
for(int b=2;b<=n;b+=2)
if(mod_pow(a,b,m)==mod_pow(b,a,m))ans++;
int x=(n+a-1)/a;
ans+=(m>>x)-(n>>x);
printf("%d\n",ans);
}
}
return 0;
}