NOIP提高组 2012 同余方程
2017-10-19 18:34
507 查看
题目描述
求关于 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。
/************************** Name:同余方程 problem:求方程ax ≡ 1 (mod b)最小正整数解 By:Shine_Sky **************************/ /*************************** ax ≡ 1 (mod b) 这是我们要求的方程 我们设有一个z使得 ax = 1 + bz 也就是 ax + bz = 1是不是很像一个东西 我说的就是拓展欧几里得 要不这样换一下 ax + b*(-z) = 1 设 y = -z 则 ax + by = 1 是不是? 我们看一下拓展欧几里得方程 ax + by = gcd(a,b) 就差后面的1了 我们假设gcd(a,b)!=1; 那么存在d是a,b的公因子且大于1 且 a = dA , b = dB; 那么ax + by = 1; 则 dA * x + dB * y = 1; d*(Ax +By) = 1; 那么d|1所以d<=1 矛盾 所以d = gcd(a,b) = 1; 就是拓欧了 ***************************/ #include <iostream> #include <cstdio> #define f(i,a,b) for(register int i = a;i <= b; ++ i) #define fd(i,a,b) for(register int i = a;i >= b; -- i) using namespace std; inline int read() { int data = 0 , w = 1; char ch = 0; while(ch != '-' && (ch < '0' || ch > '9')) ch = getchar(); if(ch == '-') w = -1,ch = getchar(); while(ch >= '0' && ch <= '9') data = data * 10 + ch - '0',ch = getchar(); return data*w; } inline void write(int x) { if(x < 0) putchar('-') , x = -x; if(x / 10) write(x / 10); putchar(x % 10 + '0'); } int a = read() , b = read() , x , y; inline void exgcd(int a , int b , int& x , int& y) { if(b == 0) { x = 1 , y = 0; return; } exgcd(b , a % b , y , x); y -= a / b * x; } int main() { exgcd(a , b , x , y); x += b;//最后x有可能小于0,但是我们要求的是最小正整数x while(x > b) x -= b;//优化%运算(个人习惯) write(x); return 0; }
相关文章推荐
- [NOIp2012提高组]同余方程
- 【NOIP】提高组2012 同余方程
- 【NOIP2012提高组】同余方程 (扩展欧几里得算法)
- [NOIP2012] 提高组 洛谷P1082 同余方程
- 洛谷P1082 同余方程 [2012NOIP提高组D2T1] [2017年6月计划 数论06]
- [NOIP2012提高组] CODEVS 1200 同余方程(扩展欧几里德算法)
- C++——拓展欧几里得模板——同余方程【NOIP2012提高组】
- NOIP2012提高组 同余方程
- NOIP2012复赛提高组day2(A:同余方程 B:借教室 C:疫情控制)
- NOIP 2012 提高组 复赛 day2 mod 同余方程
- 扩展欧几里得模板(洛谷1082 同余方程NOIP 2012 提高组 第二天 第一题)
- 【noip 2012】提高组Day2T3.疫情控制
- 洛谷 1082 [NOIP2012] 同余方程 exgcd
- Vigenère 密码NOIP 2012 提高组 第一天 第一题
- luogu1082 同余方程(NOIP2012提高组第4题)
- NOIP2012提高组解题报告
- 【扩展欧几里得】Codevs 1200: [noip2012]同余方程
- [NOIP2012] 同余方程|扩展欧几里得算法
- 【NOIP 2012】同余方程
- 2012Noip提高组Day1 T3 开车旅行