Vijos 清帝之惑系列 代码+题解

清帝之惑之康熙

这个exgcd我 复制 推一遍 
对于ax+by=c 
我们先算ax+by=(a,b) (这个是最大公约数) 
然后把解乘上c/(a,b)即可; 
所以显然当(a,b)|c时有x,y解; 
设A = b, B = a mod b。(这个就是普通的gcd哦) 
那么考虑方程Ax′+By′=(a,b), 也就是bx′+(a %b)y′=(a, b) 
假如我们求出了x’,y’怎么求x,y; 
a%b=a-a/b*b(a/b下取整)拆开再合并就是 
ay′+b(x′−⌊a/b⌋ y′)=(a,b) 
所以答案就是 
x=y′, y=x′ −⌊a/b⌋ y′ 
那我们怎么求x’,y’ 
可以递归; 
递归到最后b就会是0,这个跟gcd是一样的

我们在不断递归的时候 
a和b最终就会变成(a,b)和0 
因为a,b的递归过程和gcd的递归过程是一样的; 
那么这样的话,我们仅仅需要把x=1,y=0便可以愉快的构造一组解
 

void exgcd(Ll a,Ll b,Ll &x,Ll &y){
    if(!b){x=1;y=0;return;}
    exgcd(b,a%b,x,y);
    int X=x;
    x=y; y=X-a/b*y;
}

不过出题人可以卡long long,所以要快速乘,当然这个是毒瘤题; 
http://blog.csdn.net/Fop_zz/article/details/55000973 
这里的exgcd更简短,但本质是一样的; 
还有,比如ax+by=c; 
那么对于x 两个相邻的解相差b/gcd(a,b) 
因为 
ax+by=c等价于a(x+b)+b(y-a)=c;

这道题我们可以这样; 
我们设走k步; 
x+kn=y+km(mod l) 
后面的括号是膜域; 
就是在0~l-1的范围里; 
然后我们可以再设一个kk代表(x+kn)/l 
就是走了几圈; 
然后就变成了 
k(n-m)-kkl=y-x; 
这个和ax+by=c一样的; 
然后exgcd好了; 
求出来x后要乘(c/gcd(a,b)),这个在上面解释了; 
但是x可能是负数或者; 
这个时候再搞一下就好了;

#include<iostream>
#include<cstdio>
#include<cmath>
#include&
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值