题解 基础数论 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)。

posted on 2014-08-21 12:01  一锅土豆  阅读(102)  评论(0编辑  收藏  举报