《P1082 [NOIP 2012 提高组] 同余方程》

题目描述

求关于 x 的同余方程 ax≡1(modb) 的最小正整数解。

输入格式

一行,包含两个整数 a,b,用一个空格隔开。

输出格式

一个整数 x0​,即最小正整数解。输入数据保证一定有解。

输入输出样例

输入 #1复制

复制代码
3 10

输出 #1复制

复制代码
7

说明/提示

数据规模与约定

  • 对于 40% 的数据,2≤b≤1,000;
  • 对于 60% 的数据,2≤b≤50,000,000;
  • 对于 100% 的数据,2≤a,b≤2,000,000,000。

代码实现:

复制代码
#include <bits/stdc++.h>
using namespace std;

#define ll long long

ll pow(ll a, ll b, ll p) {
    ll base = a, res = 1;
    while (b > 0) {
        if (b & 1) {
            res *= base;
            res %= p;
        }
        base *= base;
        base %= p;
        b >>= 1;
    }
    return res;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int a, mod;
    cin >> a >> mod;
    ll t = 1, tmp = mod, cnt = 0;
    while (!(tmp & 1)) {
        cnt++;
        tmp >>= 1;
    }
    t *= pow(2, cnt - 1, mod);
    for (int i = 3; i * i <= tmp; i += 2) {
        cnt = 0;
        while (tmp % i == 0) {
            cnt++;
            tmp /= i;
        }
        if (cnt > 0) {
            t = t * (i - 1) % mod * pow(i, cnt - 1, mod) % mod;
        }
    }
    if (tmp != 1) t *= (tmp - 1);
    cout << pow(a, t - 1, mod) % mod << endl;
    return 0;
}
相关推荐
2401_8579182910 小时前
C++中的访问者模式实战
开发语言·c++·算法
elseif12310 小时前
CSP-S提高级大纲
开发语言·数据结构·c++·笔记·算法·大纲·考纲
熊猫_豆豆10 小时前
Python 基于Dlib和OpenCV实现人脸融合算法+代码
图像处理·python·算法·人脸融合
Book思议-10 小时前
【数据结构实战】双向链表:在指定位置插入数据
c语言·数据结构·算法·链表
lightqjx10 小时前
【算法】前缀和
c++·算法·leetcode·前缀和
窝子面10 小时前
LeetCode练题三:链表
算法·leetcode·链表
扶摇接北海17611 小时前
洛谷:P1104 生日
算法
旖-旎11 小时前
二分查找(寻找旋转排序数组中的最小值)(7)
c++·算法·二分查找·力扣
C羊驼11 小时前
C/C++数据结构与算法:穷举法
c语言·c++·笔记·学习·算法
guoji778811 小时前
Gemini 3.1 Pro 安全与对齐机制深度解析:可控性、合规性与企业级应用评估
大数据·人工智能·算法