poj 1061

哎,折腾了一中午,终于ac拉。考察的是欧拉算法的扩展。我在此题中,思考的时间最长的部分就是通过扩展了欧拉算法得到了解后,如何得到最小的正整数解。对于这个小问题,我却百思不得其解。然后在网上找了解题报告后,才有了思路,就是先求出解系,然后通过这个解系的式子得到最小的整数解

#include <iostream>
#include <cmath>
using namespace std;
void gcd(long long a,long long b,long long &gcdd,long long  &w,long long &t)
{
	if(b==0)
	{
		gcdd=a;w=1;t=0;
	}
	else
	{
		gcd(b,a%b,gcdd,t,w);
		t-=w*(a/b);
	}
}
int main()
{
	long long x,y,m,n,l;
	while(cin>>x>>y>>m>>n>>l)
	{
		bool flag=false;
		long long  dl=y-x;
		long long  ds=m-n;
		if(ds<0)
		{
			ds=-ds;
			flag=true;
		}
		long long  gcdd,t,w;
		gcd(l,ds,gcdd,w,t);
		if(dl%gcdd!=0) cout<<"Impossible"<<endl;
		else
		{
			t*=(dl/gcdd);
			if(flag)
				t=-t;
			l=l/gcdd;
			if(t<0)//这一步还可优化,但是目前还没看懂网上的代码
			{
				while(t<0) t+=l;
			}
			else
			{
				while(t>0) t-=l;
				t+=l;
			}
			cout<<t<<endl;
		}
	}
	return 0;
}
  


转载于:https://www.cnblogs.com/lj030/archive/2012/11/13/3002300.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值