题意:
解法:
设 椅 子 的 编 号 为 [ 0 , n − 1 ] , 一 开 始 在 S , 每 步 走 K , 假 设 走 t 步 , 那 么 ( S + t K ) % n = 0. 问 题 为 解 出 满 足 条 件 的 最 小 的 t , ( S + t k ) % n = 0 S + t k = p n , 其 中 p 是 一 个 整 数 t k − p n = − S 用 e x g c d 解 出 t 的 最 小 非 负 整 数 解 即 可 . 设椅子的编号为[0,n-1],一开始在S,每步走K,\\ 假设走t步,那么(S+tK)\%n=0.\\ 问题为解出满足条件的最小的t,\\ (S+tk)\%n=0\\ S+tk=pn,其中p是一个整数\\ tk-pn=-S\\ 用exgcd解出t的最小非负整数解即可. 设椅子的编号为[0,n−1],一开始在S,每步走K,假设走t步,那么(S+tK)%n=0.问题为解出满足条件的最小的t,(S+tk)%n=0S+tk=pn,其中p是一个整数tk−pn=−S用exgcd解出t的最小非负整数解即可.
code:
#include <bits/stdc++.h>
using namespace std;
#define int long long
int exgcd(int a,int b,int &x,int &y){
if(b==0){
x=1,y=0;
return a;
}else{
int r=exgcd(b,a%b,y,x);
y-=a/b*x;
return r;
}
}
void solve(){
int n,s,k;cin>>n>>s>>k;
int A=k,B=n,C=-s;
int x,y;
int d=exgcd(A,B,x,y);
if(C%d){
cout<<-1<<endl;
return ;
}
int kk=C/d;
int ss=B/d;
cout<<((kk*x)%ss+ss)%ss<<endl;
}
signed main(){
int T;cin>>T;
while(T--){
solve();
}
return 0;
}