题解 基础数论 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)。
浙公网安备 33010602011771号