社区讨论

欧拉定理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 条回复,欢迎继续交流。

正在加载回复...