ABC186 E - Throne(exgcd)

题意:

在这里插入图片描述

解法:

设 椅 子 的 编 号 为 [ 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,n1],S,K,t,(S+tK)%n=0.t,(S+tk)%n=0S+tk=pn,ptkpn=Sexgcdt.

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;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值