同余方程板子题,没过的可以先去看看。
题意
翻译给的很清楚。
分析
看到这个转圈圈的就很容易想到同余方程。
为了方便处理,我们就将编号全部减 \(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;
}
标签:Throne,return,ABC186E,pmod,题解,LL,int,equiv,同余
From: https://www.cnblogs.com/Chen-Jinhui/p/17976217/solution-at-abc186-e