1.题目链接。看到这个题目就觉得自己是个沙雕,省赛的时候上来看到这个类似的题目我就记得我做过,或者在哪看过来着。但是死活没有想起来,最后回来写这个题的时候弄了好半天。当时有点紧张了。忘了一些东西。
2.我们知道,对于取模当gcd(a,mod)=1的时候我们可以直接在指数上取模,但是当gcd(a,mod)!=1的时候,我们也是可以继续取模的。这个东西叫做拓展欧拉定理。
所以对于这个式子,我们就可以写成递归式子,递归不会超过20次就会达到终点。
#include<bits/stdc++.h>
using namespace std;
#pragma warning(disable:4996)
#define ll long long
ll Euler(ll n)
{
ll ans = n;
ll tmp = sqrt(n);
for (int i = 2; i <= tmp; i++)
{
if (n%i == 0)
{
ans -= ans / i;
while (n%i == 0)
n /= i;
}
}
if (n > 1)
ans -= ans / n;
return ans;
}
ll qpow(ll a, ll b,ll p)
{
ll ans = 1;
while (b)
{
if (b & 1)
ans = ans * a%p;
a = a * a%p;
b >>= 1;
}
return ans;
}
ll solve(ll p)
{
if (p == 2 || p == 1)return 0;
ll tmp = Euler(p);
return qpow(2, solve(tmp) + tmp, p);
}
int main()
{
int T;
scanf("%d", &T);
while (T--)
{
ll p;
scanf("%lld", &p);
printf("%lld\n", solve(p));
}
return 0;
}