luogu1516 POJ1061 青蛙的约会
2017-09-26 21:13
148 查看
研究同余方程。
先上代码。
要用long long。数据范围好康的!
来推导一下。其实就是 (y+nk)−(x+mk)=sl,变形易得 (m−n)k+sl=y−x,即 (m−n)k≡y−x(modl)。然后用扩展欧几里德即可。
注意,我们总是不希望gcd为负的,所以我们要调换一下当 m−n<0时。
引用一个做法:
若gcd(a, b) = d,则方程ax ≡ c (mod b)在[0, b/d - 1]上有唯一解。出处
因此应该模l/gcd。
先上代码。
#include <iostream> #include <cstdio> using namespace std; long long k, s; long long exgcd(long long a, long long b){ if(b==0){ k = 1; s = 0; return a; } long long re=exgcd(b, a%b); long long t=k; k = s; s = t - a / b * s; return re; } int main(){ long long x, y, m, n, l, gcd; cin>>x>>y>>m>>n>>l; if(m-n<0){ m ^= n, n ^=m, m ^= n; x ^= y, y ^=x, x ^= y; } if((y-x)%(gcd=exgcd(m-n, l))!=0) printf("Impossible"); else printf("%d", ((y-x)/gcd*k%(l/gcd)+(l/gcd))%(l/gcd)); return 0; }
要用long long。数据范围好康的!
来推导一下。其实就是 (y+nk)−(x+mk)=sl,变形易得 (m−n)k+sl=y−x,即 (m−n)k≡y−x(modl)。然后用扩展欧几里德即可。
注意,我们总是不希望gcd为负的,所以我们要调换一下当 m−n<0时。
引用一个做法:
若gcd(a, b) = d,则方程ax ≡ c (mod b)在[0, b/d - 1]上有唯一解。出处
因此应该模l/gcd。
相关文章推荐
- POJ 1061 青蛙的约会
- poj 1061 青蛙的约会(扩展gcd)
- 青蛙的约会 POJ - 1061 拓展欧几里得
- poj-1061-青蛙的约会
- poj 1061 青蛙的约会 (扩展欧几里得模板)
- POJ 1061 青蛙的约会 欧几里德扩展
- 青蛙的约会 POJ - 1061
- Poj 1061 青蛙的约会
- poj 1061 青蛙的约会(扩展欧几里德解不定方程)
- poj 1061 青蛙的约会(扩展欧几里得)
- POJ 1061 青蛙的约会
- poj 1061 青蛙的约会
- POJ 1061 青蛙的约会 (扩展欧几里得)
- poj 1061 青蛙的约会 扩展欧几里得
- (Relax 数论1.6)POJ 1061 青蛙的约会(扩展的欧几里得公式)
- poj 1061青蛙的约会
- POJ1061 青蛙的约会 (扩展欧几里德)
- POJ 1061 青蛙的约会
- 青蛙约会 poj 1061
- poj 1061 青蛙的约会