专栏文章

题解:UVA10692 Huge Mods

UVA10692题解参与者 7已保存评论 6

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
6 条
当前快照
1 份
快照标识符
@miot406s
此快照首次捕获于
2025/12/03 00:42
3 个月前
此快照最后确认于
2025/12/03 00:42
3 个月前
查看原文
本题有严格弱化:苦恼的小明
那一题数据特别水,而且没有多测。

前置知识:扩展欧拉定理
利用该定理可以将 aba^b 进行降幂。
那这题就是一个板子应用啊,我们从最内层先进行运算,然后算出来的值再作为下一层的指数,以此类推。
递归或者递推即可。
我写的递归不知名爆炸了,能过弱化过不了这题洛谷数据水的可以,于是这里给出递推的写法。
CPP
#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;
}

评论

6 条评论,欢迎与作者交流。

正在加载评论...