题意:
组数据,给定
,求
数据范围:
题解: 根据欧拉降幂,
可以看出来递推式了,故设
则
这里可以线性筛筛出
,或者直接
求每个数的
。
证明:对于
- 如果是奇数,下次一定变成偶数,因为奇数减 为偶数,故除奇数乘偶数结果为偶数
- 如果是偶数,至少减少
,因为根据欧拉函数的定义,至少要除
乘
故最多在 次后就会到 ,所以时间复杂度就是
代码:
#include<bits/stdc++.h>
using namespace std;
int phi(int x) {
int res = x;
for(int i = 2; 1ll * i * i <= x; i++) {
if(x % i == 0) {
res = res / i * (i - 1);
while(x % i == 0) x /= i;
}
}
if(x > 1) res = res / x * (x - 1);
return res;
}
int qp(int a, int b, int p) {
int ans = 1;
while(b) {
if(b & 1) ans = 1ll * ans * a % p;
a = 1ll * a * a % p;
b >>= 1;
}
return ans;
}
int f(int p) {
if(p == 1) return 0;
int x = phi(p);
return qp(2, f(x) + x, p);
}
int main()
{
int T = 1; scanf("%d", &T);
while(T--) {
int p; scanf("%d", &p);
printf("%d\n", f(p));
}
}