题意:
给定b,n,c,要求计算 ( b − 1 ) ∗ b n − 1 % c (b-1)*b^{n-1}\%c (b−1)∗bn−1%c,如果答案为0则输出c。
数据范围: 2 < = b < = 1 0 1 e 6 , 1 < = n < = 1 0 1 e 6 , 1 < = c < = 1 e 9 2<=b<=10^{1e6},1<=n<=10^{1e6},1<=c<=1e9 2<=b<=101e6,1<=n<=101e6,1<=c<=1e9
解法:
底数可以直接对c取模,
指数欧拉降幂一下即可。
code:
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxm=1e6+5;
char b[maxm];
char n[maxm];
int c;
int ppow(int a,int b,int mod){
int ans=1%mod;a%=mod;
while(b){
if(b&1)ans=ans*a%mod;
a=a*a%mod;
b>>=1;
}
return ans;
}
int phi(int n){
int ans=n;
for(int i=2;i*i<=n;i++){
if(n%i==0){
ans=ans/i*(i-1);
while(n%i==0)n/=i;
}
}
if(n!=1)ans=ans/n*(n-1);
return ans;
}
signed main(){
ios::sync_with_stdio(0);
cin>>b>>n>>c;
int lenb=strlen(b);
int lenn=strlen(n);
//底数b%c
int base=0;
for(int i=0;i<lenb;i++){
base=(base*10+b[i]-'0')%c;
}
//指数
for(int i=lenn-1;i>=0;i--){
n[i]--;
if(n[i]<0){
n[i]+=10;
n[i-1]--;
}else{
break;
}
}
int phi1=phi(c);
int p=0;
int f=0;
for(int i=0;i<lenn;i++){
p=p*10+n[i]-'0';
if(p>=phi1)f=1;
p%=phi1;
}
if(f)p+=phi1;
//
int ans=(base-1)*ppow(base,p,c)%c;
ans=(ans%c+c)%c;
if(ans)cout<<ans<<endl;
else cout<<c<<endl;
return 0;
}