ll pow ( ll a, ll b, ll n )
{
while(n)
{
if(n&1) b=b*a;
a=a*a;
n>>=1;
}
return b;
}
ll tenpow()
{
int len=s.size()-1;
ll res=a,base=1;
for(int i=len;i>=0;i--)
{
base=pow(res,base,s[i]-'0');
cur=pow(cur,cur,9);
}
return base;
}
模板
拓展到矩阵快速幂
pll operator *(const pll &a, const pll &b)
{
return mp( mp((a.first.first * b.first.first % p + a.first.second * b.second.first % p) % p,
(a.first.first * b.first.second % p + a.first.second * b.second.second % p) % p),
mp((a.second.first * b.first.first % p + a.second.second * b.second.first % p) % p,
(a.second.first * b.first.second % p + a.second.second * b.second.second % p) % p) );
}
pll pow(pll a,pll b,int n)
{
while(n)
{
if(n&1) b=b*a;
a=a*a;
n>>=1;
}
return b;
}
pll tenpow()
{
pll res= mp(mp(a, b), mp(1, 0));
pll base=mp(mp(1,0),mp(0,1));
int len=s.size()-1;
for(int i=len;i>=0;i--)
{
base=pow(res,base,s[i]-'0');
res=pow(res,res,9);
}
return base;
}