NOIP2012拓展欧几里得

拉板题,,,不说话

我之前是不是说过数据结构很烦,,,我想收回,,,今天开始的数论还要恶心,一早上听得头都晕了

先来一发欧几里得拓展裸

 1 #include <cstdio>
 2 void gcd(int a,int b,int&d,int&x,int&y)
 3 {
 4     if(!b)d=a,x=1,y=0;
 5     else gcd(b,a%b,d,y,x),y-=x*(a/b);
 6 }
 7 int main()
 8 {
 9     int a,b,d,x,y;
10     scanf("%d%d",&a,&b);
11     gcd(a,b,d,x,y);
12     x=(x%b+b)%b;
13     printf("%d
",x);
14     return 0;
15 }

代码又短又好懂,所以就解释了

可以看出gcd中所有关于xy的东西删光就变成了朴素的球最大公约数的gcd——其实本程序中的欧几里得是拓展欧几里得,所以应该叫exgcd而不是gcd,但是不需要求gcd所以就偷个懒好了

然后通过数学推导就能发现每一次辗转相除对应的x y的变化规律

然后就没有然后了

——虽然听晕了,但是能15行解决题目的感觉真爽

原文地址:https://www.cnblogs.com/wanglichao/p/5681654.html