社区讨论
欧拉定理20分
P1082[NOIP 2012 提高组] 同余方程参与者 3已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @lo3cdft2
- 此快照首次捕获于
- 2023/10/24 04:20 2 年前
- 此快照最后确认于
- 2023/10/24 04:20 2 年前
rt,应该是比较生僻的做法。蒟蒻刚学数论,求教大佬
CPP#include <bits/stdc++.h>
#define int long long
using namespace std;
int a, b;
const int _ = 1e6;
int phi[_], pr[_];
bool isp[_];
int qpow(int a, int n)
{
int ans = 1;
while (n)
{
if (n & 1) // 如果n的当前末位为1
ans *= a % b; // ans乘上当前的a
a *= a % b; // a自乘
n >>= 1; // n往右移一位
}
return ans % b;
}
void fac(int n)
{
int cnt = 0;
for (int i = 2; i <= n; i++)
{
if (isp[i] == 0)
pr[++cnt] = i, phi[i] = i - 1;
for (int j = 1; j <= cnt && pr[j] * i <= n; j++)
{
isp[i * pr[j]] = 1;
if (i % pr[j] == 0)
{
phi[i * pr[j]] = phi[i] * pr[j];
}
else
{
phi[i * pr[j]] = phi[i] * (pr[j] - 1);
}
}
}
}
signed main()
{
// start here..
scanf("%lld%lld", &a, &b);
fac(b);
printf("%lld", qpow(a, phi[b] - 1));
return 0;
}
回复
共 3 条回复,欢迎继续交流。
正在加载回复...