SGU141 Jumping joe
来源:互联网 发布:马云淘宝创业史 编辑:程序博客网 时间:2024/04/27 18:44
又用到了扩展欧几里得,这题其实主要是手推公式... 草稿纸被我扔进垃圾桶N次,又被我捡回来N次...T_T
首先发现 (p1-n1)x1+(p2-n2)x2 =p,又是整数解,联想扩展欧几里得
p1-n1=s
p2-n2=t
p1+n1+p2+n2=k
p1>=0,p2>=0,n1>=0,n2>=0
进一步推得
2*(n1+n2)=k-s-t
n1>=max(0,-s)
n2>=max(0,-t)
再推
2*(n1+n2)>=2*(max(0,-s)+max(0,-t))
2*(n1+n2)=k-s-t
问题转换为判断是否存在n1,n2满足上面两个式子,也就是判断是否存在s,t 使得 k-s-t>=2*(max(0,-s)+max(0,-t))
看起来好像还是很复杂... 继续推一下,讨论s,t的正负。
讨论过后发现问题变成了找s,t 使得 k>=fabs(s)+fabs(t)
我们利用扩展欧几里得已经求得了两个特解s0,t0 而s=s0+k'*x2/gcd(x1,x2) ;t=t0-k'*x1/gcd(x1,x2),其实直接让我求最值我没想出来怎么做...但是我们可以枚举k',从-40000到40000枚举一遍,求得最值(这...全凭既视感= =|||),找最值的过程注意还要满足k-s-t是2的倍数这个条件。
找到最值后,判断一下k>=fabs(s)+fabs(t)即可。
#include<iostream>#include<cstdio>#include<string>#include<cstring>#include<algorithm>#include<cmath>using namespace std;typedef long long LL;void ex_gcd(LL a,LL b,LL &x,LL &y,LL &d){ if(b==0) { x=1,y=0,d=a; return ; } else { ex_gcd(b,a%b,x,y,d); int t=x; x=y; y=t-a/b*y; return ; }}int main(){ LL x1,x2,p,k,p1,n1,p2,n2,s,t,d,tt1,tt2,m,fs,ft,i; bool find; scanf("%lld %lld %lld %lld",&x1,&x2,&p,&k); ex_gcd(x1,x2,s,t,d); if(p%d!=0) { printf("NO\n"); return 0; } s*=p/d,t*=p/d; tt1=x2/d,tt2=x1/d; find=false; s-=40000*tt1;t+=40000*tt2; for(i=-40000;i<=40000;++i) { if((k-s-t)%2==0&&(!find||fabs(s)+fabs(t)<m)) { m=fabs(s)+fabs(t); fs=s; ft=t; find=true; } s+=tt1,t-=tt2; } if(find&&k>=m) { printf("YES\n"); n1=max(0LL,-fs);n2=(k-fs-ft-2*n1)/2;p1=fs+n1;p2=ft+n2; printf("%lld %lld %lld %lld\n",p1,n1,p2,n2); } else { printf("NO\n"); } return 0;}
- SGU141 Jumping joe
- sgu141:Jumping Joe
- SGU141 Jumping Joe
- Jumping Joe SGU
- SGU 141 Jumping Joe(扩展欧几里得)
- sgu 141 Jumping Joe 扩展GCD
- SGU 141 Jumping Joe(扩展欧几里得)
- SGU 141 Jumping Joe(扩展欧几里得)
- Joe
- Joe Canadian
- 关于JOE
- Super Jumping! Jumping! Jumping!
- hdoj_1087Super Jumping! Jumping! Jumping!
- Super Jumping! Jumping! Jumping!
- Super Jumping! Jumping! Jumping!
- Super Jumping! Jumping! Jumping!
- Super Jumping! Jumping! Jumping!
- Super Jumping! Jumping! Jumping!
- Statistical Formulas For Programmers
- 企业信息化杂汤:时间,计划,经验和进度(1)
- java applet 赛车game
- awk编程
- VB与API学习笔记(3)资源文件
- SGU141 Jumping joe
- android 自定义ScrollView实现背景图片伸缩
- 第11周-项目3
- 关于自然人在物联网中的痕迹
- Mysql之数据库设计
- 字符,字节和编码
- 如何获取myeclipse8.5注册码问题
- 操作系统中锁的实现(阿里巴巴面试被虐题:cpu是怎么实现锁的)
- BoF-SIFT Features with OpenCV