欧拉定理(洛谷-P5091)(扩展欧拉定理实现)
生活随笔
收集整理的這篇文章主要介紹了
欧拉定理(洛谷-P5091)(扩展欧拉定理实现)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
題目描述
給你三個正整數(shù),a,m,b,你需要求:a^b mod m
輸入輸出格式
輸入格式:
一行三個整數(shù),a,m,b
對于全部數(shù)據(jù):
1≤a≤10^9
1≤b≤10^{20000000}
1≤m≤10^6
輸出格式:
一個整數(shù)表示答案
輸入輸出樣例
輸入樣例#1:
2 7 4
輸出樣例#1:
2
輸入樣例#2:
998244353 12345 98765472103312450233333333333
輸出樣例#2:
5333
思路:擴展歐拉定理模版題
源代碼
#include<iostream> #include<cstdio> #include<cstdlib> #include<string> #include<cstring> #include<cmath> #include<ctime> #include<algorithm> #include<utility> #include<stack> #include<queue> #include<vector> #include<set> #include<map> #include<bitset> #define EPS 1e-9 #define PI acos(-1.0) #define INF 0x3f3f3f3f #define LL long long #define Pair pair<int,int> const int MOD = 31011; const int N = 20000000+5; const int dx[] = {0,0,-1,1,-1,-1,1,1}; const int dy[] = {-1,1,0,0,-1,1,-1,1}; using namespace std;LL Euler(LL x) {LL res=x;for(LL i=2; i<(LL)sqrt(x*1.0)+1; i++) {if(x%i==0) {res=res/i*(i-1);while(x%i==0)/// 保證i一定是素數(shù)x/=i;}}if(x>1)res=res/x*(x-1);return res; }int main() {LL a,mod;scanf("%lld%lld",&a,&mod);getchar();LL b=0;LL phi=Euler(mod);char ch=getchar();bool flag=false;while(isdigit(ch)){b=b*10+(ch-'0');if(b>=phi){//擴展歐拉定理flag=true;b%=phi;}ch=getchar();}if(flag)//b>=phi時b+=phi;LL res=1;for(int i=20;i>=0;--i){//快速冪res=res*res%mod;if(b&(1<<i))res=res*a%mod;}printf("%lld\n",res);return 0; }?
總結(jié)
以上是生活随笔為你收集整理的欧拉定理(洛谷-P5091)(扩展欧拉定理实现)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 扩散(信息学奥赛一本通-T1437)
- 下一篇: 图论 —— 环与块 —— DAG 图判定