欧拉降幂(欧拉-费马定理)

map map_phi;
ll get_phi(ll n)
{
    ll res = n,a = n;
    for(ll i = 2;i * i <= n;++i){
        if(a % i == 0){
            res = res / i * (i - 1);
            while(a % i == 0)    a /= i;
        }
    }
    if(a > 1) res = res / a * (a - 1);
    return res;
}
ll fpow_mod(ll a,ll b,ll mod)
{
    ll res = 1;
    while(b){
        if(b & 1) res = (res * a) % mod;
        a = (a * a) % mod;
        b >>= 1;
    }
    return res;
}
void init(ll mod)
{
    while(mod != 1){
        map_phi[mod] = get_phi(mod);
        mod = map_phi[mod];
    }
    map_phi[1] = 1;
}

欧拉定理:a^{\phi (n)} = 1 \ mod \ n(gcd(a,n)==1)

所以对于高位的取模,我们可以用欧拉公式来降幂(根据欧拉公式将满足欧拉公式的部分转化成1,即可进行降幂操作)

小技巧:可以通过用map打表来降低时间复杂度

你可能感兴趣的:(数论)