求满足方程ax≡xa(mod2n) 的解的个数
n≤30,a≤109
询问组数T≤1000
引理一:若a,b均为奇数,且a2k+1≡b2k+1(mod2n),则a≡b(mod2n)
证明:
∵a2k+1≡b2k+1(mod2n)
∴a2k+1−b2k+1≡0(mod2n)
∴(a−b)(a2k+a2k−1b+a2k−2b2+⋯+b2k)≡0(mod2n)
由于a2k+a2k−1b+a2k−2b2+⋯+b2k 为奇数项奇数之和,为奇数
a2k+a2k−1b+a2k−2b2+⋯+b2k≡/0(mod2n)
∴a−b≡0(mod2n)
∴a≡b(mod2n)
引理二:若a为奇数,
证明:
当n=3时,显然成立
当n=k时成立,即a2k−2≡1(mod2k)
则a2k−2≡1或2k+1(mod2k+1)
又∵12≡1(mod2k+1),(2k+1)2≡22k+2×2k+1≡1(mod2k+1)
∴a2k−1≡(a2k−2)2≡1(mod2k+1)
故当n=k+1时也成立
引理三:当a为奇数时,解在模意义下唯一,为
证明:
∵ ax≡xa(mod2n)
∴ ax≡xa(mod2n−1)ax≡xa(mod2n−2)⋯ax≡xa(mod2)
∴a,x均为奇数
∵当a为奇数时,a2≡1(mod4),a2≡1(mod8)
∴ax≡a(mod4),ax≡a(mod8)
xa≡x(mod4),xa≡x(mod8)
∴a≡x(mod4),a≡x(mod8)
下证当m=1,2,3…,k(3≤k<n) 时均有 a≡x(mod2m)
则当m=k+1时,a≡x(mod2m) 亦成立
由引理二得a2k−1≡1(mod2k+1)
设a≡x≡c(mod2k−1)
∴ac≡ax≡xa≡xc(mod2k+1)
由∵a,x 均为奇数
∴c 为奇数
由引理一得a≡x(mod2k+1)
故当m=k+1时,a≡x(mod2m) 成立
故x≡a(mod2n)
(考场上只会打表找规律的我对此证明表示,“呵呵”)
好那么当a为奇数时输出1即可
当
显然对于任意n≤30,均有ax≡0(mod2n)(x≥30)
那么对于小于30的x 我们暴力找即可
对于大于30的
xa≡0(mod2n) 的充要条件为 x≡0(mod2⌈na⌉)
暴力统计即可
代码
#include<bits/stdc++.h>
#define LEN
using namespace std;
inline long long getint(){
long long x=0,p=1;
char c=getchar();
while(!isdigit(c)){
if(c=='-')p=-1;
c=getchar();
}
while(isdigit(c)){
x=(x<<3)+(x<<1)+(c^'0');
c=getchar();
}
return x*p;
}
inline void putint(long long x){
if(x<0){
x=-x;
putchar('-');
}
static long long buf[22];
long long tot=0;
do{
buf[tot++]=x%10;
x/=10;
}while(x);
while(tot)putchar(buf[--tot]+'0');
}
inline long long ksm(long long a,long long b,long long c){
long long ans=1;
while(b){
if(b&1)ans=ans*a%c;
b>>=1;
a=a*a%c;
}
return ans;
}
inline void work(long long a,long long n){
if(a%2==1){
putint(1),putchar('\n');
return;
}
long long mod=1<<n;
long long ans=0;
for(long long i=1;i<=30;++i){
if(ksm(a,i,mod)==ksm(i,a,mod))++ans;
}
long long need=(n-1)/a+1,n2=1<<need;
ans+=mod/n2-30/n2;
putint(ans),putchar('\n');
}
int main(){
long long t=getint();
while(t--){
long long a=getint(),n=getint();
work(a,n);
}
return 0;
}
本文探讨了模2^n下形如a^x ≡ x^a (mod 2^n) 的方程,并通过数学证明得出了解的个数及唯一性的结论。文中详细介绍了三个引理,用于解决特定条件下解的存在性和数量。
312





