同余方程 解题报告
2017-10-19 18:09
225 查看
[align=center]同余方程【NOIP2012提高组DAY2】[/align]
Time Limit:1000MS Memory Limit:65536K
Description
求关于 x的同余方程 ax ≡ 1 (mod b)的最小正整数解。
Input
输入文件名为 mod.in。
输入只有一行,包含一个正整数a,b,用一个空格隔开。
Output
输出文件名为 mod.out。
输出只有一行,包含一个正整数X0,即最小正整数解。输入数据保证一定有解。
Sample Input
3 10
Sample Output
7
Hint
对于40%的数据,2 ≤b≤1,000;
对于60%的数据,2 ≤b≤50,000,000;
对于100%的数据,2 ≤a, b≤2,000,000,000。
这一题是一道典型的扩展欧几里得算法的题,以样例为例我们分析下扩展欧几里得。
ax与1同余,即ax mod b=1,那么显然ax-by=1;
所以对于样例,3x-10y=1;
根据扩展欧几里得ax+by=bx+(a mod b)y,所以-10x1+3y1=1;
重复上述过程,3x2-y2=1;
可见y的系数已是-1,易得一组解(1,2);
把y2的值传回给x1,得y1=7;
把y1的值传回给x,得答案为7.
因此总的过程就是:
1、将原方程化为ax+by=1的形式;
2、不断递归ax+by=bx+(a mod b)y的过程,直至yi的系数为-1;
3、当yi的系数为-1时,得出mxi-yi=1的一组解为(1,m-1),重复将yi传回给上一层的xi-1直至传到x,得出答案。
(代码有n==0的情况,因为a mod b可能等于0)
具体证明这里不给出,大家可以另行查资料。
代码:
Time Limit:1000MS Memory Limit:65536K
Description
求关于 x的同余方程 ax ≡ 1 (mod b)的最小正整数解。
Input
输入文件名为 mod.in。
输入只有一行,包含一个正整数a,b,用一个空格隔开。
Output
输出文件名为 mod.out。
输出只有一行,包含一个正整数X0,即最小正整数解。输入数据保证一定有解。
Sample Input
3 10
Sample Output
7
Hint
对于40%的数据,2 ≤b≤1,000;
对于60%的数据,2 ≤b≤50,000,000;
对于100%的数据,2 ≤a, b≤2,000,000,000。
这一题是一道典型的扩展欧几里得算法的题,以样例为例我们分析下扩展欧几里得。
ax与1同余,即ax mod b=1,那么显然ax-by=1;
所以对于样例,3x-10y=1;
根据扩展欧几里得ax+by=bx+(a mod b)y,所以-10x1+3y1=1;
重复上述过程,3x2-y2=1;
可见y的系数已是-1,易得一组解(1,2);
把y2的值传回给x1,得y1=7;
把y1的值传回给x,得答案为7.
因此总的过程就是:
1、将原方程化为ax+by=1的形式;
2、不断递归ax+by=bx+(a mod b)y的过程,直至yi的系数为-1;
3、当yi的系数为-1时,得出mxi-yi=1的一组解为(1,m-1),重复将yi传回给上一层的xi-1直至传到x,得出答案。
(代码有n==0的情况,因为a mod b可能等于0)
具体证明这里不给出,大家可以另行查资料。
代码:
#include using namespace std; int a,b; long long gcd(long long m,long long n,bool p) { if (n==-1) return (m-1); if (n==0) return 0; //这里是yi系数等于0的情况 if (p) return gcd(n,m%n,false); return (1-m*gcd(n,m%n,false))/n; } int main() { scanf("%d%d",&a,&b); long long ans=gcd(a,-b,true); printf("%I64d",ans); }
相关文章推荐
- LuoguP2312[NOIP2014] 解方程 解题报告【秦九韶算法】
- POJ 1186 方程的解数 [解题报告] Java
- NOIP2014 解方程 解题报告(取模运算+秦九韶定理)
- codevs 3732 NOIP2014 解方程 解题报告
- POJ 2142 The Balance 解题报告(模线性方程)
- TYVJ 1115 同余 解题报告
- SGU 106. The equation 解题报告(模线性方程)
- POJ #1186 方程的解数 | 中途相遇法 + Hash | 解题报告
- POJ-1183反正切函数的应用 解题报告(数论) 反正切函数,一个同余问题
- POJ 1061 青蛙的约会 解题报告(模线性方程)
- NOIP2014解方程解题报告
- PKU1061 解题报告 青蛙的约会 __用扩展欧几里得解模同余方程
- Leetcode 396. Rotate Function 旋转方程 解题报告
- POJ 2115 C Looooops 解题报告(模线性方程)
- 一中OJ #3509 七的倍数 [USACO Jan16,洛谷P3131] | 同余前缀和 | 解题报告
- COGS 92.一元三次方程求解 解题报告
- 间谍网络--tarjan 解题报告
- [leetcode]151. Reverse Words in a String@Java解题报告
- openoj的一个小比赛(J题解题报告)poj1703(并查集)
- 【LeetCode】Linked List Cycle 解题报告(Java & Python)