独自poj2115(扩展欧几里德)

像扩展欧几里德的题啊,稍微变变形,把什么什么移到左边,什么移到右边,就这样然后套板子即可


注意long long 运算的一些特殊情况

k=1<<k;就wa了

但是改为k=1ll<<k就没事了

这里,我来解释一下:因为位移运算符返回值根据前面的数来定,而一般的整数默认的为int型的,但是只要在数字后面加ll,就变成long long型的了

这样才能保证返回值是正常的


所以这些特殊情况要积累


#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define ll __int64
using namespace std;

ll a,b,c,x,y,k;
void exgcd(ll a,ll b,ll &d,ll &x,ll &y)
{
	if (b==0){d=a;x=1;y=0;return ;}
	exgcd(b,a%b,d,y,x);y-=x*(a/b);
}
bool bdfc(ll a,ll b,ll c)
{
	ll d=0;
	exgcd(a,b,d,x,y);
	if (c%d) return false;
	x=x*c/d;
	x=x%(b/d);//不定方程的模版而以
	if(x<0)x+=b/d;
	return true;
}
int main()
{
	while(scanf("%I64d%I64d%I64d%I64d",&a,&b,&c,&k))
	{
		if (a==0&&b==0&&c==0&&k==0) break;
		k=1ll<<k;//注意!!!!
		if (bdfc(c,k,b-a))/*推出来套模版即可*/   printf("%I64d\n",x);else printf("FOREVER\n");
	}
	return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值