Happy Equation
题意
在 1 ≤ x ≤ 2 p 1\leq x\leq2^{p} 1≤x≤2p内,问有多少个x满足 a x ≡ x a ( m o d m ) a^{x}\equiv x^{a}\ (mod\ \ m) ax≡xa (mod m)
分析
通过打表发现,当a为奇数的时候,结果全为1,那么只需要考虑当a为偶数时的情况。
因为a为偶数,那么a一定可以表示为
a
=
2
∗
e
a=2*e
a=2∗e
那么
a
x
=
2
x
∗
e
x
a^{x}=2^{x}*e^{x}
ax=2x∗ex
当
x
≤
p
x\leq p
x≤p时,因为
1
≤
p
≤
30
1\leq p\leq 30
1≤p≤30,所以可以暴力枚举
1
≤
x
≤
p
1\leq x \leq p
1≤x≤p有多少符合等式的。
当
x
>
p
x> p
x>p时,
a
x
m
o
d
m
=
0
a^{x}mod\ m=0
axmod m=0,此时只需要找
x
a
m
o
d
m
=
0
x^{a}mod\ m=0
xamod m=0一共有多少符合的即可,又因为
x
a
m
o
d
m
=
0
x^{a}mod \ m=0
xamod m=0,所以x一定不是奇数,x一定是偶数。所以x又可以表示为
x
=
2
f
∗
g
x
a
=
2
a
f
∗
g
a
x=2^{f}*g\\ x^{a}=2^{af}*g^{a}
x=2f∗gxa=2af∗ga
即可得到当
a
f
≥
p
af\geq p
af≥p时
x
a
m
o
d
m
=
0
x^{a}mod\ m=0
xamod m=0
因此
f
≥
⌈
p
a
⌉
f\geq \lceil \frac{p}{a} \rceil
f≥⌈ap⌉
所以就只需要求出在
[
p
,
2
p
]
[p,2^{p}]
[p,2p]次方之间
2
⌈
p
a
⌉
2^{\lceil \frac{p}{a} \rceil}
2⌈ap⌉的倍数有多少个即可,即算一个前缀和
AC代码
#include <bits/stdc++.h>
using namespace std;
using LL = long long;
LL qp(LL a, LL b, LL mod) {
LL res = 1;
for (; b; b >>= 1, a = a * a % mod) {
if (b & 1) {
res = res * a % mod;
}
}
return res;
}
void Solve() {
LL a, p;
cin >> a >> p;
if (a & 1) {
cout << "1\n";
return;
}
LL ans = 0;
LL mod = 1 << p;
for (int i = 1; i <= p; i++) {
if (qp(a, i, mod) == qp(i, a, mod)) {
ans++;
}
}
LL q = (p + a - 1) / a;
q = 1LL << q;
ans = ans + (mod / q - p / q);
cout << ans << '\n';
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int T;
cin >> T;
while (T--) {
Solve();
}
return 0;
}