[bzoj3884]上帝与集合的正确用法——欧拉函数

时间:2022-05-07 05:40:25

题目大意

[bzoj3884]上帝与集合的正确用法——欧拉函数

题解

出题人博客

代码

#include <bits/stdc++.h>
using namespace std;
const int M = 10001000;
int phi[M];
int Phi(int x) {
int i, ret = x;
for (i = 2; i * i <= x; i++) {
if (x % i == 0) {
ret /= i;
ret *= (i - 1);
while (x % i == 0)
x /= i;
}
}
if (x ^ 1)
ret /= x, ret *= x - 1;
return ret;
}
int pow(long long x, int y, int p) {
long long ret = 1;
while (y) {
if (y & 1)
ret = (ret * x) % p;
x = (x * x) % p;
y >>= 1;
}
return ret;
}
int solve(int p) {
if (p == 1)
return 0;
int tmp = 0;
while (~p & 1)
p >>= 1, ++tmp;
int phi_p = Phi(p);
int ret = solve(phi_p);
(ret += phi_p - tmp % phi_p) %= phi_p;
ret = pow(2, ret, p) % p;
return ret << tmp;
}
int main() {
int T, p;
scanf("%d", &T);
while (T--) {
scanf("%d", &p);
printf("%d\n", solve(p));
}
}