题解 | #[NOIP2017]小凯的疑惑#

[NOIP2017]小凯的疑惑

https://ac.nowcoder.com/acm/problem/16414

exgcd的做法,题解区有一个这么讲的了,这里按照我自己的理解解释一遍。

首先是要求我们找到的最大的,那么必然存在有解。

因为互质,那么一定存在解。将2式左右同时减1得到:。然后代入1的值得到:

3式无解,必然需要满足。又由于,同时都是正整数,那么ab一定异号。可以分成如下两种情况讨论,并且都需要满足:

  • ,那么必然大于等于0, 为了无解,需要让 ,也就是 ,贪心的取最大就是
  • ,那么必然大于等于0, 为了无解,需要让 ,也就是 ,贪心的取最大就是

需要注意,两种情况的x'和y'不一样。都是满足等式的情况下的最小值,这里也很好理解,因为x'和y'是此消彼长的存在,一个大,一个就会小,可以举个的例子。这样当越来越小,就越来越大为了。为了满足x 小于所有的,自然是取他的最小值,同理。

//exgcd
tuple<int,int,int> exgcd(int a,int b){
    if(b == 0) return {1,0,a};
    auto [nx,ny,g] = exgcd(b,a%b);
    return {ny,nx - a/b*ny,g};
}
void solve(){
    int a,b; cin >> a >> b;
    auto [x,y,g] = exgcd(a,b);
    //求出x的最小值
    int t = b/g;
    x = (x%t + t)%t;
    t = a / g;
    y = (y%t + t)%t;
    cout << (x - 1) * a + (y - 1) * b - 1 << endl;
}
//省略main
全部评论

相关推荐

10-28 10:48
已编辑
门头沟学院 Java
孩子我想要offer:发笔试后还没笔试把我挂了,然后邮箱一直让我测评没测,后面不知道干嘛又给我捞起来下轮笔试,做完测评笔试又挂了😅
点赞 评论 收藏
分享
11-16 01:13
宜春学院 Java
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务