[vijos1164] 曹冲养猪
2015-08-19 13:22
232 查看
传送门
https://vijos.org/p/1164题目大意
求解模方程组题解
是中国剩余定理的裸体但是我并不想用中国剩余定理,因为它只适用于模数互质
ydcydc数学
参见里面的 将中国剩余定理丢进垃圾桶
ansmoda1=b1 ansmoda2=b2ans\mod a_1=b_1\ \ \ ans\mod a_2=b_2
a1⋅x+b1=a2⋅y+b2a_1\cdot x+b_1=a_2\cdot y+b_2
用扩欧求解一个x,令b=x⋅a1+b1,a=lcm(a1,a2),则将方程合并为了用扩欧求解一个x,令b=x\cdot a_1+b_1,a=lcm(a_1,a_2),则将方程合并为了
xmoda=bx\mod a=b
代码
var d,e:array[0..20]of int64; i,j:longint; n:longint; a,b,c,x,y,t,v:int64; function gcd(a,b:int64):int64; begin if b=0 then gcd:=a else gcd:=gcd(b,a mod b); end; function lcm(a,b:int64):int64; begin lcm:=(a*b)div gcd(a,b); end; procedure exgcd(a,b:int64; var x,y:int64); var t:longint; begin if b=0 then begin x:=1; y:=0; end else begin exgcd(b,a mod b,x,y); t:=x; x:=y; y:=t-y*(a div b); end; end; begin readln(n); for i:=1 to n do readln(d[i],e[i]); for i:=1 to n-1 do {x*d[i]+e[i]=y*d[i+1]+e[i+1]} {x*d[i]+y*(-d[i+1])=e[i+1]-e[i]} begin a:=d[i]; b:=d[i+1]; c:=e[i+1]-e[i]; {a*x+b*y=c} t:=gcd(a,b); a:=a div t; b:=b div t; c:=c div t; exgcd(a,b,x,y); x:=x*c div t; v:=x*t div b; x:=x-v*b div t; if x<0 then x:=x+b div t; x:=(x+b)mod b; d[i+1]:=lcm(d[i],d[i+1]); e[i+1]:=x*d[i]+e[i]; end; writeln(e ); end.
相关文章推荐
- 关于空类大小问题的总结
- WAS导入证书--错误提示:java.security.cert.CertPathValidatorException: Certificate chaining error
- 弹出窗口反正点做同样的事情
- 理解导航控制器
- awk
- Linux深入篇之七:配置Mysql+keepalived主从架构
- Linux下使用inotify实现对文件的监控
- oracle 根据汉字返回拼音函数
- MGTemplateEngine 模版引擎简单使用
- 做一天和尚就要撞好一天钟
- Leetcode 212 Word Search II 单词查找
- 字节流与字符流的区别详解
- Html a标签 关联连接在新窗口打开
- suds 在python3.x上的安装并访问webservice
- 【原】移动web点5像素的秘密
- 冒泡排序并统计其循环次数
- 统计一句话中重复字符、单词的个数,HashMap,Queue List
- c3p0 连接池配置
- linux 命令 - 切换目录cd
- 构造 HDOJ 5400 Arithmetic Sequence