poj1061(线性同余方程)

题目链接:http://poj.org/problem?id=1061

思路:算得上是线性同余方程模板题,要注意的是可能会返回负数解,要取正数,我们知道:若一组 < x,y > 是ax+by=c的一组解,

我们只需要让解得的x不断减b/d,直到再减就为负数时,所得的x就是我们要的解。 

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <cctype>
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <queue>
#include <map>
#include <set>
#include <sstream>
#include <iomanip>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const ll inff = 0x3f3f3f3f3f3f3f3f;
#define FOR(i,a,b) for(int i(a);i<=(b);++i)
#define FOL(i,a,b) for(int i(a);i>=(b);--i)
#define REW(a,b) memset(a,b,sizeof(a))
#define inf int(0x3f3f3f3f)
#define si(a) scanf("%d",&a)
#define sl(a) scanf("%lld",&a)
#define sd(a) scanf("%lf",&a)
#define ss(a) scanf("%s",a)
#define mod int(1e9+7)
#define pb push_back
#define Pll pair<ll,ll>
#define P pair<int,int>
#define pi acos(-1)
ll x,y,n,m,l;
ll exgcd(ll a,ll b,ll &x,ll &y)
{
    if(b==0) {x=1,y=0;return a;}
    ll d=exgcd(b,a%b,y,x);
    y-=x*(a/b);
    return d;
}//扩展欧几里得算法
int main()
{
    cin.tie(0);
    cout.tie(0);
    cin>>x>>y>>m>>n>>l;
    ll xx,yy,d,c;
    if(n==m) return puts("Impossible"),0;
    if(m<n) swap(n,m),swap(x,y);
    c=y-x;
    d=exgcd(m-n,l,xx,yy);
    if(c%d!=0) puts("Impossible");
    else cout<<((xx*c/d)%(l/d)+(l/d))%(l/d)<<endl;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_40858062/article/details/81238884