码迷,mamicode.com
首页 > 其他好文 > 详细

P3951 小凯的疑惑

时间:2019-08-25 18:16:02      阅读:101      评论:0      收藏:0      [点我收藏+]

标签:ssl   log   void   art   不能   推荐   sig   oid   ble   

P3951 小凯的疑惑

数论极菜的小萌新我刚看这题时看不懂exgcd做法的题解,后来在网上找到了一篇博客,感觉代码和推导都更加清新易懂,于是在它的基础上写了题解qwq

两数互质,且有无限个,想到不定方程ax+by=gcd(a,b)=1,并且是一定有解的

对于合法的数k,可以表示为 k=a×x1+b×y1(x1>=0,y1>=0)

找最大不合法的数,那么比它大的数(如k+1)一定是合法的,于是题目变成找最大的k使k-1不合法

由于本题中ax+by=1,对于不合法的数k-1,可以表示为

k-1=ax1+by1-(ax0+by0)=a(x1-x0)+b(y1-y0) ...1(x0 是ax0+by0=1中x最小且非负的整数解)

或k-1=a(x1-x0‘)+b(y1-y0‘)? ...2((y0 是ax0+by0=1中y最小且非负的整数解))

由ax0+by0=1,x
0和y0
? 必定不能同号

对于1 y0<0 所以y1-y0>0 只要x1-x0<0 则k-1不合法

对于2 x0‘<0 所以x1-x0‘>0 只要y1-y0‘<0则k-1不合法

所以如果要k-1不合法,那么肯定所有x,y情况都不合法,即两式都要不合法

所以当x1-x0<0 时,x1<x0,那么最大的整数x1=x0-1,同理y1=y0‘-1 两式都不合法, 而且k最大

ans=(x0-1)a+(y0-1)b-1

我们学到了什么

1.看范围? --1e9,互质等字眼,我们要用O(logn)的扩展欧几里得

2.转化问题? --找最大的k使k-1不合法

3.式子标准化? --将k-1用a(x1-x0)+b(y1-y0)的形式表示

4.探究不合法的条件? --x1-x0<0,y1-y0‘<0

5.贪心找最值? --x1=x0-1,y1=y0-1

#include<cstdio>
using namespace std;
#define int long long
int a,b,x,y;
inline void exgcd(int a,int b,int &x,int &y) {
    if (!b) x=1,y=0;
    else exgcd(b,a%b,y,x),y-=a/b*x;
}
signed main() {
    scanf("%lld%lld",&a,&b);
    exgcd(a,b,x,y),x=(x+b)%b,y=(y+a)%a;
    printf("%lld",(x-1)*a+(y-1)*b-1);
}

关于进一步的ab-a-b做法推荐这个博客

P3951 小凯的疑惑

标签:ssl   log   void   art   不能   推荐   sig   oid   ble   

原文地址:https://www.cnblogs.com/Randolph68706/p/11408360.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!