题目:f(0) = 1 and 0^0=1。f(n) = (n%10)^f(n/10) for all n >0. Please calculate f(n)%m. (2 ≤ n , m ≤ 10^9).
与上一题类似,都是降幂的,这个题需要递归。。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll eular(ll n)
{
ll ans=n;
for(ll i=2;i*i<=n;i++)
{
if(n%i==0)
{
ans=ans-ans/i;
while(n%i==0)
n/=i;
}
}
if(n>1)
ans=ans-ans/n;
return ans;
}
ll qmod(ll x,ll p,ll mod)
{
ll ans=1;
while(p)
{
if(p&1)
{
ans=ans*x;
if(ans>mod)
ans=ans%mod+mod;
}
x=x*x;
if(x>mod)
x=x%mod+mod;
p>>=1;
}
return ans;
}
ll dfs(ll n, ll m)
{
if(n<10) return n;
ll tmp=dfs(n/10,eular(m));
return qmod(n%10,tmp,m);
}
int t;
int main()
{
scanf("%d",&t);
while(t--)
{
ll n,m;
scanf("%lld%lld",&n,&m);
ll ans=dfs(n,m)%m;
printf("%lld\n",ans);
}
return 0;
}