pku1061青蛙的约会
2010-08-14 11:22
309 查看
#include<iostream> using namespace std; __int64 result; __int64 exGCD(__int64 a,__int64 b,__int64 &x,__int64 &y) { __int64 t,ret; if(b==0){ x=1;y=0;return a;} ret = exGCD(b,a%b,x,y); t=x; x=y; y=t-(a/b)*y; return ret; } bool fg(__int64 a,__int64 b,__int64 n) { __int64 x,y,d,x0; d=exGCD(a,n,x,y); if(b%d!=0) return false; x0=x*(b/d)%n; result=(x0+n)%n; return true; } int main() { __int64 x,y,m,n,L; while(cin>>x>>y>>m>>n>>L) { if(fg(n-m,x-y,L)) cout<<result<<endl; else cout<<"Impossible"<<endl; } return 0; }
http://acm.pku.edu.cn/JudgeOnline/problem?id=1061
二、 同余模运算
1.定理:设d=gcd(a,b),在必存在两个整数x,y使得d=ax+by成立。
2.鸥几里德公式:设d=gcd(a,b),且d’=gcd(b,amodb)则d= ±d’。
证明:amodb=a-[a/b]b,由于d|a,且d|b,则d|(amodb)
因此d| d’。反之,d’|(amodb)则d’|a,又由于d’| b,
所以d’| d。
故d= ±d’。
鸥几里德公式的推广形式:ax+by=d= d’= bx’+(amodb)y’
= bx’+( a-[a/b]b)y’
= a y’+b (x’-[a/b] y’)
如果b=0,则gcd(a,b)= a,x=1,y=0。
3.计算同余方程ax=b(modn)(n>0)
1)通过鸥几里德公式的推广形式求出d=gcd(a, n)和两个整数x’, y’满足d=ax’+ny’.
显然,x’是方程ax=b (modn)的一个解;
2)若d不能整除b,则方程ax=b(modn)无解;否则有d个解,令
X0= x’(b/d) modn,其余的d-1个解可以通过对模n加上(n/d)的倍数。
即:Xi= (X0+i(n/d) ) modn.
题意: 两只青蛙在圆上往相同的方向跳 跳到同一点上才见面求此时青蛙最少跳的次数 题目给出了 青蛙在圆形数轴上的位子 x y 和 它们各自一跳的距离 m n 和L 圆周长。
思路: 假设青蛙跳t次相遇 则满足等式 (x+mt)%L=(y+mt)%L 变形得到 (n-m)t%L=(x-y)%L --->at%L=b%L--->at=b(mod L) 然后根据公式计算就行了。
相关文章推荐
- pku 1061青蛙的约会
- [拓展欧几里得算法]Pku1061-青蛙的约会
- PKU 1061 青蛙的约会(经典拓展欧几里德)
- pku 1061 青蛙的约会 同余方程
- pku1061 青蛙的约会
- 青蛙的约会pku1061
- pku 1061 - 青蛙的约会
- pku 1061 青蛙约会
- PKU1061 解题报告 青蛙的约会 __用扩展欧几里得解模同余方程
- pku 1061 青蛙约会
- PKU-1061-青蛙的约会
- PKU 1061 青蛙的约会
- pku 1061 青蛙的约会(解模线性方程)
- pku1061青蛙的约会 解题报告
- PKU-1061 青蛙的约会 (扩展的欧几里德算法)
- poj-1061-扩展欧几里得算法-青蛙的约会
- POJ 1061 青蛙约会(一次同余方程)
- POJ 1061 青蛙的约会( 扩展欧几里得)
- [ACM] POJ 1061青蛙的约会(扩展欧几里得求模线性方程)
- POJ 1061 青蛙的约会