K - Happy Equation
基本信息
题解
通过打表可以发现,当 为奇数时,答案为 。
证明
当 为奇数时,可以证明 是一个解。
首先,当 时, 显然满足
当 时,根据模的乘法有 ,根据 欧拉定理 有
则
当 为奇数时,若 为偶数,则 是奇数, 是偶数,不可能对 取模后相等。因此 也是奇数。
首先通过反证法证明以下引理。
引理 1:不存在两个奇数 和 满足 且 。
假设存在两个满足要求的奇数 和 ,进行因式分解得
里的每一项都是奇数,共有 项,奇数个奇数项加起来仍然是奇数,不存在质因子 。而 ,因此质因子 少于 个。即
与假设矛盾。
令 表示 的质因数分解中 的数量。接下来通过反证法证明以下引理。
引理 2:设 且 且 ,则 。
不失一般性地,假设 ,由题设有
等式两边同时除以 得
是奇数,由于 则 是偶数,因此等式左边是奇数;由于 则 是偶数,由于 则 是偶数,因此等式右边是偶数。产生矛盾。
接下来通过反证法证明:不存在两个奇数 和 满足 且 且 。
假设存在两个满足要求的奇数 和 ,相减得
令 表示 的质因数分解中 的数量。由引理 1 得 ,则 (否则 ),由引理 2 得
根据 升幂(LTE)定理 有
即
因为 是奇数,所以 。因为 是奇数,当 时, 和 均为正偶数,因此 ,。因此
产生矛盾。
当 时,满足 且 的 显然只有 。
当 为偶数时,设 的质因数分解中有 个 ,那么 的质因数分解中就有 个 。当 时,。因为 是正偶数,即 ,所以当 时我们只要考虑满足 的 。
同样,设 的质因数分解中有 个 ,那么 的质因数分解中就有 个 。为了让 ,必须要有 ,即 。 中, 的倍数有 个。
由于 , 的部分枚举即可。复杂度 。
参考代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28 | #include <bits/stdc++.h>
using namespace std;
long long power(long long a, int b, int MOD) {
long long y = 1;
for (; b; b >>= 1) {
if (b & 1) y = y * a % MOD;
a = a * a % MOD;
}
return y;
}
void solve() {
int a, p; scanf("%d%d", &a, &p);
if (a & 1) { printf("1\n"); return; }
int ans = 0;
for (int x = 1; x < p; x++) ans += (power(a, x, 1 << p) == power(x, a, 1 << p) ? 1 : 0);
int k = (p + a - 1) / a;
ans += (1 << (p - k)) - (p - 1) / (1 << k);
printf("%d\n", ans);
}
int main() {
int tcase; scanf("%d", &tcase);
while (tcase--) solve();
return 0;
}
|