题解:UVA10692 Huge Mods
fish_love_cat · · 题解
本题有严格弱化:苦恼的小明。
那一题数据特别水,而且没有多测。
前置知识:扩展欧拉定理。
利用该定理可以将
那这题就是一个板子应用啊,我们从最内层先进行运算,然后算出来的值再作为下一层的指数,以此类推。
递归或者递推即可。
我写的递归不知名爆炸了,能过弱化过不了这题洛谷数据水的可以,于是这里给出递推的写法。
#include<bits/stdc++.h>
#define int long long
int mod;
using namespace std;
int phi[10000005];
int sump[10000005];
bool is_p[10000005];
vector<int>v; //第i个质数
void Phi(int n){
int p=0;
is_p[0]=1;
is_p[1]=1;
phi[1]=1;
sump[1]=1;
for(int i=2;i<=n;i++){
if(!is_p[i]){
v.push_back(i);
for(int j=i;j*i<=n;j++)
is_p[j*i]=1;
phi[i]=i-1;
}
for(int j=0;j<v.size()&&v[j]*i<=n;j++)
phi[v[j]*i]=phi[i]*(v[j]-(i%v[j]!=0));
sump[i]=sump[i-1]+phi[i];
}
}
#define flc_INF LLONG_MAX
int qpow(int a,int b,int p=flc_INF){
int ans=1;
bool flag=0;
if(b==0)return 1;
while(b){
if(b&1)ans*=a,flag|=(ans>=p),ans%=p;
a*=a,b>>=1,flag|=(a>=p),a%=p;
}
return ans+flag*p;
}
int a[1234600];
int pp[1234600];
int n;
signed main(){
Phi(1000000);
int T=0;
while(cin>>mod>>n){
pp[1]=mod;
for(int i=2;i<=n;i++)
pp[i]=phi[pp[i-1]];
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=n-1;i;i--)
a[i]=qpow(a[i],a[i+1],pp[i]);
printf("Case #%d: %d\n",++T,a[1]%mod);
}
return 0;
}