2019icpc南京网络赛B----欧拉降幂

感谢舍友给的板子。
就是个板子题,大家一定也需要。

#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<map>
#define MOD(a, b) a >= b ? a % b + b : a

using namespace std;
typedef long long ll;
map<ll, ll>mp;
ll fast_pow(ll a, ll b, ll m)
{
    ll res = 1;
    while(b)
    {
        if(b & 1)
        {
            res =  MOD(res * a, m);
        }
        a = MOD(a * a, m);
        b >>= 1;
    }
    return res;
}

ll phi(ll n)
{
    ll ans = n;
    ll k = n;
    if(mp.count(k)) return mp[k];
    for(int i = 2; i * i <= n; i++)
    {
        if(n % i == 0)
        {
            ans -= ans / i;
            while(n % i == 0)
                n /= i;
        }
    }
    if(n > 1) ans -= ans / n;
    mp[k] = ans;
    return ans;
}

ll solve(ll a, ll b, ll m)
{
    if(m == 1) return 0;
    if(b <= 1) return fast_pow(a, b, m);
    ll p = phi(m);
    ll t = solve(a, b - 1, p);
    ll g = __gcd(a, m);
    if(g == 1 || b < p) return fast_pow(a, t, m);
    else
        return fast_pow(a, p + t, m);
}

int main()
{
    ll a, b, m;
    int t;
    scanf("%d", &t);
    while(t--)
    {
        scanf("%lld%lld%lld", &a, &b, &m);
        printf("%lld\n", solve(a, b, m) % m);
    }
    return 0;
}

发布了40 篇原创文章 · 获赞 13 · 访问量 861

猜你喜欢

转载自blog.csdn.net/weixin_43891021/article/details/100312002