poj1062
2015-10-02 17:16
375 查看
扩展欧几里得,注意一些小细节。
在sa+tb=L(扩展a和b,s和t是扩展出来的可变的系数)中,如果a,b同时为0的话,无论L是不是0都无法用扩展欧几里得求出正确的答案,要另求;只要a和b至少有一个不为0,则就可以用扩展欧几里得求出正确的答案。
在sa+tb=L(扩展a和b,s和t是扩展出来的可变的系数)中,如果a,b同时为0的话,无论L是不是0都无法用扩展欧几里得求出正确的答案,要另求;只要a和b至少有一个不为0,则就可以用扩展欧几里得求出正确的答案。
#include<stdio.h> #include<string.h> #include<iostream> using namespace std; void exgcd(long long int *a,long long int *b,long long int p,long long int l,long long int *d){ if(l==0){ *a=1; *b=1; *d=p; return; } else{ long long int a1,b1,d1; exgcd(&a1,&b1,l,p%l,&d1); *d=d1; *a=b1; *b=a1-p/l*b1; return; } } int main(){ long long int x,y,m,n,l; long long int a,b; long long int p,q; long long int d; scanf("%lld%lld%lld%lld%lld",&x,&y,&m,&n,&l); x=x%l; y=y%l; if(m>n){ p=m-n; q=((y-x)%l+l)%l;//y-x写成了x-y } else{ p=n-m; q=((x-y)%l+l)%l;//x-y写成了y-x } exgcd(&a,&b,p,l,&d); if(q%d){ printf("Impossible\n"); } else{ a=a*q/d; if(a<0){ a=a+((-a)/(l/d)+1)*(l/d); } else if(a>0){ a=a%(l/d); } printf("%lld\n",a); } }
相关文章推荐
- Vs2012于Linux应用程序开发(2):图案
- 矩阵中的路径
- 【Unity3D】3D角色换装++ Advance
- android 仿美团支付的密码输入页
- Word Search II
- bash组织成树数据结构
- java学习笔记----枚举测试题
- JAVA设计模式之单件模式
- 2015 四川省赛 B Carries (脑洞题)
- Java HTTP协议问题集锦
- O(V*n)的多重背包问题
- Effective c++读书笔记三
- [面试时]我是如何讲清楚GCD的
- 使用dbms_file_transfer传输ASM file出现ORA-15001
- silverlight画图 虚线 反射效果 射线渐变效果Radial Gradient
- STC12C5A60S2外部中断P3^2,P3^3 的应用 【中断函数略讲interrupt using】
- Unity3d 3d角色换装实现原理及步骤
- 组织的信息能力与竞争优势
- java15:面向对象
- 【因子算法】——求一个数的因子、质因子、求两个数的公因子