Happy Equation(数论+讨论)

Happy Equation

题意

​ 在 1 ≤ x ≤ 2 p 1\leq x\leq2^{p} 1x2p内,问有多少个x满足 a x ≡ x a   ( m o d    m ) a^{x}\equiv x^{a}\ (mod\ \ m) axxa (mod  m)

分析

​ 通过打表发现,当a为奇数的时候,结果全为1,那么只需要考虑当a为偶数时的情况。

​ 因为a为偶数,那么a一定可以表示为
a = 2 ∗ e a=2*e a=2e
那么
a x = 2 x ∗ e x a^{x}=2^{x}*e^{x} ax=2xex
x ≤ p x\leq p xp时,因为 1 ≤ p ≤ 30 1\leq p\leq 30 1p30,所以可以暴力枚举 1 ≤ x ≤ p 1\leq x \leq p 1xp有多少符合等式的。

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=2fgxa=2afga
即可得到当 a f ≥ p af\geq p afp
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 fap
所以就只需要求出在 [ p , 2 p ] [p,2^{p}] [p,2p]次方之间 2 ⌈ p a ⌉ 2^{\lceil \frac{p}{a} \rceil} 2ap的倍数有多少个即可,即算一个前缀和

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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值