题解 基础数论 POJ 1061
题意:见题目。
做法:扩展欧几里得做法。
代码:
#include <iostream> #include <cstdio> using namespace std; typedef long long int64; int64 gcd_ex(int64 a, int64 b,int64& x,int64&y) { if (b==0) {x=1;y=0;return a;} int64 d=gcd_ex(b,a%b,y,x); y-=a/b*x; return d; } int main() { int64 n,m,x,y,l,t,k1,k2; scanf("%I64d%I64d%I64d%I64d%I64d",&x,&y,&n,&m,&l); if(x>y) { t=x,x=y,y=t; t=n,n=m,m=t; } int64 a,b; if(n>m) a=n-m,b=y-x; else a=m-n,b=l+x-y; int64 g=gcd_ex(a,l,k1,k2); if(b%g!=0) printf("Impossible\n"); else { k1=k1*b/g; l=l/g; printf("%I64d\n",k1%l); } return 0; }
错误:wa:未保证k在1-l/g范围内;
扩充:计算ax+by=c(c为任意正整数)中,x=(x*(c/d)%(b/d)+(b/d))%(b/d);(d为gcd)。