题解 [ABC186E] Throne

【洛谷博客】

同余方程板子题,没过的可以先去看看。

题意

翻译给的很清楚。

分析

看到这个转圈圈的就很容易想到同余方程。

为了方便处理,我们就将编号全部减 \(1\),于是编号就变成 \(0 \sim N-1\)

然后就可以很容易的列出同余方程:

\[S + Kx \equiv 0\pmod{N} \]

移项可得:

\[Kx \equiv -S \pmod{N} \]

将右边加上 \(N\) 使得右边非负:

\[Kx \equiv N-S \pmod{N} \]

然后直接求解 \(x\) 即可。

代码

//the code is from chenjh
#include<cstdio>
using namespace std;
typedef long long LL;
LL x,y;
LL exgcd(const LL&a,const LL&b){//扩展欧几里得求解同余方程。
	if(!b){
		x=1,y=0;
		return a;
	}
	LL d=exgcd(b,a%b);
	LL z=x;
	x=y;
	y=z-y*(a/b);
	return d;
}
int mian(){
	LL a,b,s;//a 指的是 K,b 指的是 N。
	scanf("%lld%lld%lld",&b,&s,&a);
	LL g=exgcd(a,b),t=(b-s)%b;
	if(t%g) puts("-1");//判断无解的情况。
	else printf("%lld\n",(x%b+b)%b*(t/g)%(b/g));
	return 0;
}
int main(){
	int T;scanf("%d",&T);
	while(T--) mian();
	return 0;
}
posted @ 2024-01-20 11:41  Chen_Jinhui  阅读(12)  评论(0)    收藏  举报