P5091 模板欧拉定理
Posted xiongchongwen
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P5091 模板欧拉定理相关的知识,希望对你有一定的参考价值。
如有乱码,请点击。
题目背景
出题人也想写有趣的题面,可惜并没有能力。
题目描述
给你三个正整数,a,m,ba,m,b,你需要求:
a^b mod mabmodm
输入格式
一行三个整数,a,m,ba,m,b
输出格式
一个整数表示答案
输入输出样例
输入 #1
2 7 4
输出 #1
2
输入 #2
998244353 12345 98765472103312450233333333333
输出 #2
5333
说明/提示
注意输入格式,a,m,ba,m,b 依次代表的是底数、模数和次数
样例1解释:
2^4 mod 7 = 224mod7=2
输出2
数据范围:
对于全部数据:
1≤a≤10^91≤a≤109
1≤b≤10^{20000000}1≤b≤1020000000
1≤m≤10^81≤m≤108
#include<algorithm> #include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<queue> using namespace std; int a,b,m,temp,phi,ans=1; bool flag; int main(){ int i; char c; scanf("%d%d",&a,&m); temp=phi=m; for(i=2;i*i<=m;++i){ if(temp%i==0){ phi=phi-phi/i; while (temp%i==0){ temp/=i; } } } if (temp>1){ phi=phi-phi/temp; } while (!isdigit(c=getchar())); for (;isdigit(c);c=getchar()){ b=b*10+c-‘0‘; if (b>=phi){ flag=true; b%=phi; } } if (flag){ b+=phi; } for (i=20;i>=0;--i){ ans=1ll*ans*ans%m; if (b&(1<<i)){ ans=1ll*ans*a%m; } } cout<<ans; return 0; }
以上是关于P5091 模板欧拉定理的主要内容,如果未能解决你的问题,请参考以下文章