社区讨论

64pts WA求助

P5091【模板】扩展欧拉定理参与者 1已保存回复 0

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@mk97sxvt
此快照首次捕获于
2026/01/11 12:09
2 个月前
此快照最后确认于
2026/01/14 21:35
2 个月前
查看原帖
提交记录
刚学数论,在教练的网站上看到了这题,在那个地方写题写哭了,提交了四次(数据和洛谷有些许不同),两次40pts两次50pts
就到洛谷来参考题解,结果看不懂QAQ
代码(可能与大佬们不一样):
CPP
#include <bits/stdc++.h>
using namespace std;
#define int long long
int a,m,b,B;
string s;
vector<int> fj(int n){
	vector<int> p;
	for(int i=2;i*i<=n;i++){
		if(n%i==0){
			p.push_back(i);
			while(n%i==0)n/=i;
		}
	}
	return p;
}
int phi(int n){
	vector<int> p=fj(n);
	int ans=n;
	for(int i=0;i<p.size();i++)ans=ans/p[i]*(p[i]-1);
	return ans;
}
int fastPow(int a,int b,int c){
	int ans=1;
	while(b){
		if(b%2==1)ans=ans*a%c;
		a=a*a%c;
		b/=2;
	}
	return ans;
}
signed main(){
	cin>>a>>m>>s;
	if(m==1){cout<<0;return 0;} 
	int Phi=phi(m);
	bool is=0;
	for(int i=0;i<s.size();i++){
		b=b*10+(s[i]-'0')%Phi;
		if(!is){
			B=B*10+(s[i]-'0');
			if(B>=Phi){
				is=1;
			}
		}
	}
	if(is)b=(b%Phi)+Phi;
	else b=B%Phi;
	cout<<fastPow(a,b,m)<<endl;
	return 0;
}
如果我的方法有问题,请友善指正,谢谢大佬们!
悬一关

回复

0 条回复,欢迎继续交流。

正在加载回复...