POJ-2115-C Looooops-扩展欧几里德算法

http://poj.org/problem?id=2115


for (variable = A; variable != B; variable += C)
 
问你要执行多少次,循环才会停止,不会停止输出forever

输入abck;

mod=1<<k;

也就是  (a+b*x)%mod==c

// (x*c+a)%(1<<k)==b
//即 (x*c+a)与b同余 (1<<k)
//即 (x*c)与b-a同余 (1<<k)
//即解c*x%mod==b-a
//即c*x-y*mod==b-a  用扩展欧几里德算法解得X*c+Y*mod=1的X
//  则x=X*(b-a),当然有解的前提是 (b-a)%gcd(c,mod)==0

 

#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <iostream>
using namespace std; 
const double pi=acos(-1.0);
double eps=0.000001; 
__int64 k,a,b,c;

// (x*c+a)%(1<<k)==b
//即 (x*c+a)与b同余 (1<<k)
//即 (x*c)与b-a同余 (1<<k)
//即解c*x%mod==b-a
//即c*x-y*mod==b-a  用扩展欧几里德算法解得X*c+Y*mod=1的X
//  则x=X*(b-a),当然有解的前提是 (b-a)%gcd(c,mod)==0

__int64 t,p; 
		__int64 gd ; 
void extend_euild(__int64 a, __int64 b)
{
	if (b==0)
	{
		t=1;
		p=0; 
		gd=a;
	}
	else
	{
		extend_euild(b,a%b);
		__int64 tmp=t;
		t=p;
		p=tmp-a/b*p;
	}
} 
__int64 one=1; 
int main()
{

	while( 	scanf("%I64d%I64d%I64d%I64d",&a,&b,&c,&k)!=EOF)
	{ 
		if (!a&&!b&&!c&&!k) break;
		__int64 n=one<<k;
		__int64 d=b-a;
		 
		if (d==0)
		{ printf("0\n");continue;} 
		
			extend_euild(c,n);
		if (d%gd==0)
		{
			d/=gd;  
			c/=gd;
			n/=gd;
			t*=d;
			t=t%n+n; 
			printf("%I64d\n",t%n);
		} 
		else printf("FOREVER\n");
		
	}
	
	return 0;
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值