pku 1061青蛙的约会

扩展欧几里得

详细介绍 : http://hi.baidu.com/%B1%BF%D0%A1%BA%A2_shw/blog/item/0676025d56a87d4afbf2c093.html

扩展欧几里得的代码是照着小白打的。。

发现代码挺好的。。

说一下扩展欧几里得 

设 a, b, c为任意整数, 若方程 ax + by = c的一组整数解为 ( x0, y0 ),则它的任意整数解都可以写成 ( x0 + kb', y0 - ka' ),其中 a' = a/gcd(a,b), b' = b/gcd(a,b),k为任意整数。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<string>
#include<algorithm>
using namespace std;
#define inf 0x3f3f3f3f
#define eps 1e-8
#define ll long long
#define ull unsigned long long
#define mnx 1005
void exgcd( ll a, ll b, ll &d, ll &x, ll &y ){
	if( !b ) {
		d = a, x = 1, y = 0;        // d恰好是最大公约数 
	}
	else {
		exgcd( b, a%b, d, y, x ); 
		y -= x*(a/b);
	}
}
int main(){
	ll x, y, m, n, l;
	ll a, b, c, d, t;
	while( cin>>x>>y>>m>>n>>l ){
		a = n-m, b = l, c = x-y;
		exgcd( a, b, d, x, y );
		if( c % d ){
			printf("Impossible\n");continue;
		}
		ll ans = x*(c/d);      // 不能写挫了 ans = x/d*c, 这样wa死你  ans是方程的一组整数解 
		t = b/d;               // b' = b/gcd(a,b); 
		ans = (ans%t+t) % t;   // 最小整数解就出来了,自己意会一下 
		cout<<ans<<endl;
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值