【HDOJ 2837】Calculation 欧拉降幂

根据欧拉定理,可降幂:

有亿些坑点,其中一个值得注意的是不管指数b和\(\phi[m]\)的大小关系,都可以先对\(\phi[m]\)取模,看最后还需不需要加上\(\phi[m]\)即可

细节见代码:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n,m;
int t;

ll phi(ll n){   
	ll nn=n;
	ll ans=n;
	for(ll i=2;i*i<=nn;i++){
		if(n%i==0){
			ans=ans-ans/i;
			while(n%i==0){
				n/=i;
			}
		}
	}
	if(n>1){
		ans=ans-ans/n;
	}
	return ans;
} 

ll Pow(ll a,ll b,ll mod){
	ll ans=1;
	while(b){
		if(b%2){
			ans*=a;
			ans%=mod; 
		}
		a*=a;
		a%=mod;  //注意这里也需要取模 
		b/=2;
	}
    if(ans==0) ans+=mod;    ////
	return ans;
}

ll sum(ll a,ll b,ll m){
    ll ans=1;
    for(int i=1;i<=b;i++){
        ans*=a;
        if(ans>=m) return ans;
    }
    return ans;
}

ll f(ll n,ll m){   //f(n) % m
    if(m==1) return 0;
    if(n==0) return 1;
    if(n<10) return n;
    ll phi_m=phi(m);
    ll up=f(n/10,phi_m);  
    ll base=sum(n%10,up,phi_m);
    if(base>=phi_m) 
        return Pow(n%10,up+phi_m,m);
    else return base;
}

int main(){
    cin>>t;
    while(t--){
        scanf("%d%d",&n,&m);
        printf("%lld\n",f(n,m));
    }
    system("pause");
    return 0;
}
posted @ 2022-07-25 22:00  starlightlmy  阅读(47)  评论(0)    收藏  举报