不知道哪里错了(裸exgcd)
  • 板块学术版
  • 楼主windows_fleon
  • 当前回复2
  • 已保存回复2
  • 发布时间2022/10/22 16:57
  • 上次更新2023/10/27 06:29:29
查看原帖
不知道哪里错了(裸exgcd)
531499
windows_fleon楼主2022/10/22 16:57

题目描述:

一个C语言的for循环:

    for(int i=A;i!=B;i+=C)st;

其中i表示变量,A、B和C分别表示初值、终值和步长,st表示循环体。 要求计算当循环变量i运算在k位无符号整数体系下(运算值范围:0~2^k-1,此时,i+=c溢出后截断),循环体st会执行多少次?

输入格式 输入每组数据包括4个整数A,B,C和k。

输出格式 对于每组数据,输出循环次数,注意循环次数不能是负值,如果永远不能结束,输出FOREVER。

代码:

#include<iostream>
#define ll long long
using namespace std;
ll a1,b1,c1,k1;
ll exgcd(ll a,ll b,ll &x,ll &y){
	if(!b){x=1;y=0;return a;}
	ll temp=exgcd(b,a%b,x,y);
	ll t=x;x=y;y=t-a/b*y;
	return temp;
}
int main(){
	cin>>a1>>b1>>c1>>k1;
	while(!(a1==0&&b1==0&&c1==0&&k1==0)){
		ll a=c1,b=(1<<k1),c=b1-a1,x,y;
		ll t1=exgcd(a,b,x,y);
		if(c%t1) cout<<"FOREVER";
		else{
			ll x1=c/t1*x,bu=b/t1;
			if(bu<0) bu*=-1;
			x1=(x1%bu+bu)%bu;
			cout<<x1;
		}
		puts("");
		cin>>a1>>b1>>c1>>k1;
	}
	return 0;
}
//c1*c+y*2^k1=b1-a1
2022/10/22 16:57
加载中...