洛谷 P1082 同余方程

题目描述

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

输入输出格式

输入格式:

输入只有一行,包含两个正整数 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。

NOIP 2012 提高组 第二天 第一题

//智商太低,搞这个搞了一晚上……

解题思路

  我太菜了,不会扩欧,用的是dalao教的费马小定理,但这题没规定b一定是质数,所以要用欧拉定理,费马小定理其实就是欧拉定理的特殊情况。

    1、同余的传递性。

    若$$a \equiv b\mod p $$    且$$b \equiv c\mod p $$    则$$ a \equiv c\mod p$$

    2、欧拉定理(同余的那个)$$a^{\phi(b)} \equiv 1\mod b$$

    3、题目要求的那个式子$$ax \equiv 1\mod b$$

  以上三项代换一下得到$ax \equiv a^{\phi(b)} \mod{b}$,我不知道为什么左边的a可以除过去——$x \equiv a^{\phi(b)-1}\mod b$,于是最小的x就是$a^{\phi(b)-1}\mbox{%} b$。

源代码

#include<stdio.h>
#include<time.h>
#include<math.h>
#include<algorithm>
#include<cstring>
#define ll long long
long long phi(long long n)
{
    ll res=n,now=n,max=ceil(sqrt(n));
    int b[max+1],size=0;ll prime[max/2];
    memset(b,1,sizeof(b));b[1]=0;
    for(int i=2;i<=max;i++){//不筛素数表会TLE一个点,本机要跑44s……
        if(b[i]==0) continue;
        size++;prime[size]=i;
        for(int t=2*i;t<=max;t+=i) b[t]=0;
    }
    for(int i=1;i<=size;i++){
        if(now%prime[i]==0){
            res=res/prime[i]*(prime[i]-1);
            while(now%prime[i]==0){
                now/=prime[i];
            }
        }
        if(now==1) break;
    }
    if(now!=1) res=res/now*(now-1);
    return res;
}

long long p(long long n,long long k,long long mo)
{
    if(k==0) return 1;
    if(k==1) return n%mo;
    long long a=p(n,k>>1,mo)%mo;
    a=a*a%mo;
    //printf("%lld %lld\n",k,a);
    return a*p(n,k&1,mo)%mo;
}

int main()
{
    //freopen("mod.in","r",stdin);
    //freopen("mod.out","w",stdout);//cogs的印记……
    long long a,b;
    //double start=clock();
    scanf("%lld%lld",&a,&b);
    long long k=phi(b)-1;
    //printf("%lf\n",(clock()-start)/1000000);
    printf("%lld\n",(p(a,k,b)+b)%b);
    return 0;
}
时间: 2024-10-29 10:45:50

洛谷 P1082 同余方程的相关文章

洛谷P1082 同余方程 数论

洛谷P1082 同余方程 数论 要求 ax === 1 (mod b) 相当于求 ax + by == 1 的解并要求 x 为最小的正整数 这样我们只要 扩展欧几里德来一发,然后最小正整数 取 mod 就行了 但是一般题目里会让你求一个最小的x,当你用拓欧求出一个解时,一般会让你去找一个最小解,我们只需要对这个数取模b就行了(如果求正数,你只需要先加一个b,再取模行了,应该都知道吧) 1 #include <cstdio> 2 #include <cstdlib> 3 #inclu

洛谷——P1082 同余方程

P1082 同余方程 题目描述 求关于 x 的同余方程 ax ≡ 1 (mod b)的最小正整数解. 输入输出格式 输入格式: 输入只有一行,包含两个正整数 a, b,用一个空格隔开. 输出格式: 输出只有一行,包含一个正整数 x0,即最小正整数解.输入数据保证一定有解. 输入输出样例 输入样例#1: 3 10 输出样例#1: 7 说明 [数据范围] 对于 40%的数据,2 ≤b≤ 1,000: 对于 60%的数据,2 ≤b≤ 50,000,000: 对于 100%的数据,2 ≤a, b≤ 2,

洛谷P1082 同余方程

题目描述 求关于 x 的同余方程 ax ≡ 1 (mod b)的最小正整数解. 输入输出格式 输入格式: 输入只有一行,包含两个正整数 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

洛谷 P1082 同余方程 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 题目链接:https://www.luogu.org/problem/show?pid=1082 题目描述 求关于 x 的同余方程 ax ≡ 1 (mod b)的最小正整数解. 输入输出格式 输入格式: 输入只有一行,包含两个正整数 a, b,用一个空格隔开. 输出格式: 输出只有一行,包含一个正整数 x0,即最小正整数解.输入数据保证一定有解. 输入输出样例 输入样例#1: 3 10 输出样例#1: 7 说明 [数据范围]

[NOIP2012] 提高组 洛谷P1082 同余方程

题目描述 求关于 x 的同余方程 ax ≡ 1 (mod b)的最小正整数解. 输入输出格式 输入格式: 输入只有一行,包含两个正整数 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

洛谷P1082同余方程

#include<bits/stdc++.h>using namespace std; int exGcd(int a,int b,int &x,int &y) { if(b==0) { x=1; y=0; return a; } int r=exGcd(b,a%b,x,y); int t=x; x=y; y=t-a/b*y; return r;} int main() { int a,b,i,j,k,m,n; cin>>m>>n; int gcd=ex

洛谷P1082/NOIP2012 同余方程

洛谷P1082/NOIP2012 同余方程 题目描述 求关于 x 的同余方程 ax ≡ 1 (mod b)的最小正整数解. 输入输出格式 输入格式: 输入只有一行,包含两个正整数 a, b,用一个空格隔开. 输出格式: 输出只有一行,包含一个正整数 x0,即最小正整数解.输入数据保证一定有解. 输入输出样例 输入样例#1: 复制 3 10 输出样例#1: 复制 7 说明 [数据范围] 对于 40%的数据,2 ≤b≤ 1,000: 对于 60%的数据,2 ≤b≤ 50,000,000: 对于 10

扩展欧几里得模板(洛谷1082 同余方程NOIP 2012 提高组 第二天 第一题)

题目描述 求关于 x 的同余方程 ax ≡ 1 (mod b)的最小正整数解. 输入输出格式 输入格式: 输入只有一行,包含两个正整数 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

洛谷 P2709 BZOJ 3781 小B的询问

题目描述 小B有一个序列,包含N个1~K之间的整数.他一共有M个询问,每个询问给定一个区间[L..R],求Sigma(c(i)^2)的值,其中i的值从1到K,其中c(i)表示数字i在[L..R]中的重复次数.小B请你帮助他回答询问. 输入输出格式 输入格式: 第一行,三个整数N.M.K. 第二行,N个整数,表示小B的序列. 接下来的M行,每行两个整数L.R. 输出格式: M行,每行一个整数,其中第i行的整数表示第i个询问的答案. 输入输出样例 输入样例#1: 6 4 3 1 3 2 1 1 3