2012 同余方程

同余方程

题目描述

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

输入描述

输入只有一行,包含两个正整数 a, b,用 一个 空格隔开。

输出描述

输出只有一行包含一个正整数x0,即最小正整数解,输入数据保证一定有解。

样例输入

3 10

样例输出

7

数据范围及提示

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

//题目是a*x=1+b*y;
//可以转化成a*x+b*y=1;
//裸扩建欧几里得;
//到时候加到正的就可以了;
//b*x+a%b*y=1 => b*x+(a-b*(a/b))*y=1 =>a*y+b*(x-(a/b)*y)=1;
#include<cstdio>
int a,b,x,y,ans;
int exgcd(int a,int b,int &x,int &y){
    if(b==0){a=1;x=1;y=0;return 1;}
    int g=exgcd(b,a%b,x,y),z;
    z=x;x=y;y=z-(a/b)*y;
    return g;
}
int main(){
    scanf("%d%d",&a,&b);
    ans=exgcd(a,b,x,y);
    while(x<0) x+=b;
    printf("%d",x);
    return 0;
}

时间: 2024-10-11 11:52:44

2012 同余方程的相关文章

【NOIP】提高组2012 同余方程

[算法]扩展欧几里德算法 [题解]学完扩欧就可以随便水了... 转化为不定方程ax-by=1. 因为1且题目保证有解,所以方程有唯一解. 紫书曰:同余方程的一个解其实指的是一个同余等价类. 所以满足x≡x'(mod b)的其他x'也是方程的解. 题目求最小正整数解,因此ans=x%b. #include<cstdio> #define ll long long void gcd(ll a,ll b,ll& g,ll& x,ll& y) { if(!b){g=a;x=1,

欧几里得与扩展

欧几里得: gcd递归定义:对于任意正整数b,gcd(a,b)= gcd(b,a mod b). 证明: 只需要证明上面两者能相互整除. 设gcd(a,b)= d,所以d | a 且 d | b.由带余除法可以得出: a mod b = a - qb.其中 q = └a / b┘.所以 a mod b 是a 和 b的一个线性方程组合, 所以d |a mod b.又因为 d | b,所以 d | gcd(b,a mod b),即gcd(a,b)|gcd(b,a mod b). 证明gcd(b,a

扩展欧几里得模板(洛谷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

同余方程 2012年NOIP全国联赛提高组

时间限制: 1 s   空间限制: 128000 KB  题解 题目描述 Description 求关于 x 同余方程 ax ≡ 1 (mod b)的最小正整数解. 输入描述 Input Description 输入只有一行,包含两个正整数 a, b,用 一个 空格隔开. 输出描述 Output Description 输出只有一行包含一个正整数x0,即最小正整数解,输入数据保证一定有解. 样例输入 Sample Input 3 10 样例输出 Sample Output 7 数据范围及提示 D

codevs 1200 同余方程 2012年NOIP全国联赛提高组 x

/*我在提交的时候发现了一个特别好玩的事,有兴趣的话,可以自己尝试一下:把下面说的地方的y=0改为y=1在codevs里面能够ac,这--数据水?到一定境界--厉害了,吓得我还以为自己对了,结果一讲才知道,根本不对,然后我自己自己弄数据它就不同,这是--我太厉害了?哈哈哈*/ 题目描述 Description 求关于 x 同余方程 ax ≡ 1 (mod b)的最小正整数解. 输入描述 Input Description 输入只有一行,包含两个正整数 a, b,用 一个 空格隔开. 输出描述 O

【codevs 1200】【NOIP 2012】同余方程 拓展欧几里德求乘法逆元模板题

模板,,, #include<cstdio> using namespace std; void exgcd(long long a,long long b,long long &x,long long &y){ if (b==0) {x=1; y=0;} else {exgcd(b,a%b,x,y); int t=y; y=x-a/b*y; x=t;} } int main(){ long long a,b,x,y; scanf("%lld %lld\n"

洛谷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 同余方程

题目描述 求关于 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

1200 同余方程

1200 同余方程 2012年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 求关于 x 同余方程 ax ≡ 1 (mod b)的最小正整数解. 输入描述 Input Description 输入只有一行,包含两个正整数 a, b,用 一个 空格隔开. 输出描述 Output Description 输出只有一行包含一个正整数x0,即最小正整数解,输入数据保证一定有解. 样例输入 Sample In