歐拉降冪南京icpc

目前看來這個歐拉降冪的取模操作MOD函數需要在快速冪中使用,代替%號取模,m是模數,a應該是被取模數,但是根據圖片,a應該是指數,等一個大佬。
最後輸出結果的時候還要再對m取模
在這裏插入圖片描述

#include <bits/stdc++.h>
#define eps 1e-14
#define pi acos(-1)
#define ll long long
#define RD T*(rand()*2-RAND_MAX)
#define Drand (long double)rand()/RAND_MAX
#define LINF 0x7f7f7f7f7f7f7f7f
#define INF 0x3f3f3f3f
using namespace std;
const int maxn=1e5+100;
const long long mod=1e18;
ll MOD(ll a,ll m){return a>m?a%m+m:a;}
ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
ll q_pow(ll a,ll b,ll mod)
{
    ll sum=1;
    while(b){
        if(b&1) sum=sum*a%mod;
        a=a*a%mod;
        b>>=1;
    }
    return sum%mod;
}

ll q_pow_mod(ll a,ll b,ll mod)
{
    if(mod==0)return 0;
    ll sum=1;
    while(b){
        if(b&1) sum=MOD(sum*a,mod);
        a=MOD(a*a,mod);
        b>>=1;
    }
    return MOD(sum,mod);
}

ll phi(ll n)
{
    ll ans = n;
    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;
    return ans;
}


int cal(int a,int b,int m)
{
    if(b==1 || m==1)
    {
        return MOD(a,m);
    }
    return q_pow_mod(a,cal(a,b-1,phi(m)),m);
}

int main()
{
//    freopen("in.txt", "r", stdin);
//    freopen("out.txt", "w", stdout);
    int t;
    scanf("%d",&t);
    while(t--){
        int a,b,m;
        scanf("%d%d%d",&a,&b,&m);
        if(a==1 || b==0)
        {
            printf("%d\n",1%m);
            continue;
        }
        printf("%d\n",cal(a,b,m)%m);
    }
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章