请求 DEBUG
查看原帖
请求 DEBUG
922691
Hisy楼主2024/4/13 10:41
#include<cstdio>
#include<cmath>
#include<map>
#define int long long
inline int sqrt(int sqrtner){
	if(sqrtner<4){
		return 1;
	};
	int low=0,high=sqrtner;
	while(low<high){
		int middle=(low+high+1)>>1;
		if(middle*middle>sqrtner){
			high=middle-1;
		}else{
			low=middle;
		};
	};
	if(low*low>sqrtner){
		return high;
	};
	return low;
};
inline int power(int first,int second,int mod){
	int result=1;
	while(second){
		if(second&1){
			(result*=first)%=mod;
		};
		(first*=first)%=mod;
		second>>=1;
	};
	return result;
};
inline int exgcd(int first,int second,int &answer1,int &answer2){
	if(!second){
		answer1=1;
		answer2=0;
		return first;
	};
	int gcd=exgcd(second,first%second,answer1,answer2),tmp=answer1;
	answer1=answer2;
	answer2=tmp-first/second*answer2;
	return gcd;
};
inline int baby_step_giant_step(int first,int second,int mod){
	std::map<int,int> hash;
	if(second==1){
		return 0;
	};
	if(!(first%mod)){
		if(!second){
			return 1;
		};
		return -2;
	};
	second%=mod;
	int sqrtner=sqrt(mod)+2,tmp=second,factor=power(first,sqrtner,mod);
	for(int iter=1;iter<=sqrtner;++iter){
		(tmp*=first)%=mod;
		hash[tmp]=iter;
	};
	tmp=1;
	for(int iter=1;iter<=sqrtner;++iter){
		(tmp*=factor)%=mod;
		if(hash.count(tmp)){
			return ((iter*sqrtner-hash[tmp])%mod+mod)%mod;
		};
	};
	return -2;
};
signed main(signed,char**){
	int test,answer1=0,answer2=0;
	scanf("%lld",&test);
	while(test--){
		int mod,first,second,start,finish;
		scanf("%lld %lld %lld %lld %lld",&mod,&first,&second,&start,&finish);
		if(start==finish){
			puts("1");
		}else if(!first){
			if(second==finish){
				puts("2");
			}else{
				puts("-1");
			};
		}else if(first==1){
			int flag=((finish+second-start)%mod+mod)%mod,gcd=exgcd(second,mod,answer1,answer2),answer;
			if(flag%gcd){
				puts("-1");
			}else{
				answer1*=flag/gcd;
				answer=(answer1%mod+mod)%mod;
				if(answer){
					printf("%lld\n",answer);
				}else{
					printf("%lld\n",mod);
				};
			};
		}else{
			int arg1=first,arg2=(first*finish%mod-finish+second)*power((first*start%mod-start+second),mod-2,mod);
			printf("%lld\n",baby_step_giant_step(arg1,arg2,mod)+1);
		};
	};
	return 0;
};
2024/4/13 10:41
加载中...