整数性质
时间限制:
500 ms | 内存限制:
65535 KB
难度:
1
-
描述
-
我们知道,在数学中,对于任意两个正整数a和b,必定存在一对整数s、t使得sa+tb=gcd(a,b)。
-
输入
-
多组测试数据。
每组数据输入两个非负整数a和b且a+b>0且a不等于b。
其中0<=a,b<100000。
输出
- 输出满足条件的 s 和 t 。 样例输入
-
2 4 3 8 737 635
样例输出
-
1 0 3 -1 193 -224
提示
运用欧几里得定理求得的才是正确答案。
/* 扩展欧几里德定理 对于与不完全为 0 的非负整数 a,b,gcd(a,b)表示 a,b 的最大公约数。那么存在唯一的整 数 x,y 使得 gcd(a,b)=ax+by。 设 a>b。 1,显然当 b=0,gcd(a,b)=a。此时 x=1,y=0; 2,ab<>0 时 设 ax1+by1=gcd(a,b); bx2+(a mod b)y2=gcd(b,a mod b); 根据朴素的欧几里德原理有 gcd(a,b)=gcd(b,a mod b); 则:ax1+by1=bx2+(a mod b)y2; 即:ax1+by1=bx2+(a-(a/b)*b)y2=ay2+bx2-(a/b)*by2; 根据恒等定理得:x1=y2; y1=x2-(a/b)*y2; 这样我们就得到了求解 x1,y1 的方法:x1,y1 的值基于 x2,y2. 上面的思想是以递归定义的,因为 gcd 不断的递归求解一定会有个时候 b=0,所以递归可以 结束。 */ #include<stdio.h> int s,t; void extend_Euclid(int a,int b) { int k; if(a==0) { s=0; t=1; return ; } else if(b==0) { s=1; t=0; return ; } else { extend_Euclid(b,a%b); k=s; s=t; t=k-a/b*t; } } int main() { int a,b; while(scanf("%d%d",&a,&b)!=EOF) { extend_Euclid(a,b); printf("%d %d\n",s,t); } return 0; }
-
多组测试数据。