问题虫洞: B. super_log
黑洞内窥:
定义一个式子:
键入a,b,m;
求一个最小的x,满足上式,然后输出x%m;
思维光年:
易推导得出:
x = a^a^a^.........^a^a(一共b个a的高阶幂)%m;
然后就是欧拉降幂了:
一开始我的做法:
因为欧拉降幂有条件限制,一开始忘记了这个限制条件,导致疯狂的wa(这时我用的是for循环处理),
后来即使我发现了是限制条件的问题,由于代码能力太弱,
不会用for循环继续限制这个条件,并且本人对递归也比较迷~~~
遂将idea转达队友,然后队友找个板子就A掉了,,!(我太难了~~~)
ACcode:
#include<bits/stdc++.h>
#define Mod(a,b) a<b?a:a%b+b //重定义取模,按照欧拉定理的条件
#define LL long long
#define N 100010
using namespace std;
LL n,q,m,a,b,T;
map<LL,LL> mp;
LL qpow(LL x,LL n,LL m)
{
LL res=1;
while(n)
{
if (n&1)
res=Mod(res*x,m),n--;
x=Mod(x*x,m);
n>>=1;
}
return res;
}
LL phi(LL k)
{
LL i,s=k,x=k;
if (mp.count(k))
return mp[x]; //记忆化存储
for(i = 2; i * i <= k; i++) //欧拉函数
{
if(k % i == 0)
s = s / i * (i - 1);
while(k % i == 0)
k /= i;
}
if(k > 1)
s = s / k * (k - 1);
mp[x]=s;
return s;
}
LL solve(LL l,LL r,LL m)
{
if (l==r||m==1)
return Mod(a,m); //限制条件
return qpow(a,solve(l+1,r,phi(m)),m); //往上递归
}
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%lld%lld%lld",&a,&b,&m);
if(m == 1)
printf("0\n");
else if(b == 0 || a == 1)
printf("1\n");
else
printf("%lld\n",solve(1,b,m) % m);
}
return 0;
}