数论:快速乘

题目来源:点击这里

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll q_mul( ll a, ll b, ll mod ){
    
    //快速乘
    long long ans = 0;
    while(b){
    
    
        if(b & 1){
    
    
            b--;
            ans =(ans+ a)%mod; 
        }
        b /= 2;
        a = (a + a) % mod; 
    }
    return ans;
}
ll fastpow(ll a,ll pow,ll mod){
    
    
    ll base=a;
    ll ans=1;
    while(pow){
    
    
        if(pow&1){
    
    
            ans=q_mul(ans,base,mod);
        }
        base=q_mul(base,base,mod);
        pow>>=1;
    }
    return (ll)ans;
}//快速幂板子 
int main(){
    
    
    int t;
    scanf("%d",&t);
    while(t--){
    
    
        char s[100000+5];
        ll phi=1;
        ll m;
        bool flag=false;
        ll uis=0;
        scanf("%s",s);
        scanf("%lld",&m);
        ll mm=m;//求pow(a,b)%m
        for(ll i=2;i*i<=mm;++i){
    
    
            if(mm%i) continue;
            phi*=i-1;
            mm/=i;
            while(mm%i==0)
                phi*=i,
            mm/=i;
        }
        if (mm > 1) phi *= mm - 1;
        for(ll i=0;i<strlen(s);++i){
    
    
            uis=uis*10+(s[i]-'0');
            if (uis >= phi) flag = 1, uis %= phi;
        }
        if (uis >= phi) flag = 1, uis %= phi;
        if (flag) uis += phi;
        printf("%lld\n",(fastpow(3,uis,m)-2+m)%m );
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_45695839/article/details/110442641
今日推荐