幂塔个位数的计算(欧拉降幂板子)

https://ac.nowcoder.com/acm/contest/9981/H


思路:欧拉降幂。

由于没怎么接触,补一下这块知识。

 

由于我们取个位数,所以对于本题目来说是mod10(p=10)

至于欧拉降幂的递归形式,就是如下面两个图所示. 

 

举个小例子模拟一下:

幂塔个位数的计算(欧拉降幂板子)_第1张图片

还有一个问题。我们都是整数,这个题这么大,怎么看取多少位呢。

mod10递归几次就结束了,我们打不了取100层。

对于这个底数a。我们要观察。对于其%2这一层,相当于判奇偶,只要知道个位。

对于%4,则要个位和十位。解释:比如一个三位数x,那么其可以拆分成(k*100+num)%4=k*100%4+num%4;前者的mod为0;所以只考虑后者的num,也就是十位和百位。

我们对底数a取两位就好。

剩下来就是部分板子。

#include
#include
#include
#include
#include
#include
#include
#include
#include
#define debug(a) cout<<#a<<"="<num) break;
            v[primes[j]*i]=1;
            if(i%primes[j]==0) {
                phi[i*primes[j]]=phi[i]*primes[j];
                break;
            }
            phi[i*primes[j]]=phi[i]*(primes[j]-1);
        }
    }
    phi[1]=1;
}
LL q_pow(LL a,LL b,LL p){
    LL res=1;
    while(b){
        if(b&1) res=res*a>p?res*a%p+p:res*a;
        b>>=1;
        a=a*a>p?a*a%p+p:a*a;
    }
    return res;
}
LL solve(LL a,LL b,LL m){
    if(m==1||b==0) return 1;///phi(m)>s1>>s2;
    LL len1=s1.size();LL len2=s2.size();
    LL a=0;
    for(LL i=max((LL)0,len1-3+1);i=3) b=100;
    else{
        for(LL i=0;i

 

你可能感兴趣的:(数论,模板类)