P5091 【模板】扩展欧拉定理 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)https://www.luogu.com.cn/problem/P5091
大概题意:给出三个正整数,a,m,b 你需要求出 的值,其中
首先求出m的欧拉函数,由欧拉定理可知, 当b>时,,
这样我们就可以把b缩小到2之内了。
首先我们需要读入b,由于b太大了,不可能一次性读完,这样longlong都会爆,所以我们要一个字
符一个字符读入,然后边读边取模即可,最后返回的一定是一个小于的数,
然后对这种数量级的数取模,这应该不用我多讲吧,快速幂即可。
第一步:求出m的欧拉函数
ll phi(ll n) {
ll ans = n;
for (ll i = 2; i<= n/i; i++) {
if (n % i == 0) {
ans = ans / i * (i - 1);
while (n % i == 0)n /= i;
}
}
if (n != 1)ans =( ans / n) * (n - 1);
return ans;
}
第二步:边读边模求指数;
inline ll read(ll n) {
ll f = 0,x=0;
char c = getchar();
while (!isdigit(c))c=getchar();
while (isdigit(c)) {
x = x * 10 + c-'0';
if (x >= n)f = 1;
x %= n;
c = getchar();
}
return x+(f == 1 ? n : 0);
}
第三步:快速幂
ll fast_pow(ll a,ll b,ll m) {
ll s = 1;
while (b) {
if (b & 1)s = s * a % m;
a = a * a % m;
b >>= 1;
}
return s;
}
第四步:合并
#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<cstdio>
#include<cmath>
#include<string>
#include<cstring>
#include<string>
#include<algorithm>
#include<vector>
#include<cctype>
#include<map>
#include<set>
#include<queue>
#include<numeric>
#include<iomanip>
using namespace std;
typedef long long ll;
ll a, m, b;
ll phi(ll n) {
ll ans = n;
for (ll i = 2; i<= n/i; i++) {
if (n % i == 0) {
ans = ans / i * (i - 1);
while (n % i == 0)n /= i;
}
}
if (n != 1)ans =( ans / n) * (n - 1);
return ans;
}
inline ll read(ll n) {
ll f = 0,x=0;
char c = getchar();
while (!isdigit(c))c=getchar();
while (isdigit(c)) {
x = x * 10 + c-'0';
if (x >= n)f = 1;
x %= n;
c = getchar();
}
return x+(f == 1 ? n : 0);
}
ll fast_pow(ll a,ll b,ll m) {
ll s = 1;
while (b) {
if (b & 1)s = s * a % m;
a = a * a % m;
b >>= 1;
}
return s;
}
int main() {
cin >> a >> m;
ll mns = phi(m);
b = read(mns);
cout<<fast_pow(a, b, m);
}