zoukankan      html  css  js  c++  java
  • NOIP2017 | D2T3

    D1T1

    noip2017最难题。

    (O(log)) 做法

    要求最大的 (ax+by) ,其中 (x<0)(y<0)
    已知存在: (ax'+by'=gcd(a,b)=1)
    考虑已知 (c=ax+by) ,其中 (xgeq 0)(y geq 0) ,则 (c-1=ax+by-1=a(x-x')+b(y-y'))
    如果 (c-1) 为答案,一定有 (x-x'<0)(y-y'<0)
    (x'_ ext{min})(ax'+by'=1)(x') 的最小正整数解, (y'_ ext{min})(ax'+by'=1)(y') 的最小正整数解。
    现在令 (x=x'_ ext{min}-1,y=y'_ ext{min}-1)
    (a)(b) 互质和“一定有答案”,可以得到 (a eq b,a eq 1,b eq 1) ,所以 (x'_ ext{min})(y'_ ext{min}) 不可能都为 (1) ,即 (x)(y) 不可能都为 (0)
    所以 (ax+by>1)(ax+by-1 > 0)
    又因为一定有 (x-x'<0)(y-y'<0) ,即 (a(x-x')+b(y-y')=ax+by-1) 是无法准确支付的价值之一。
    如果答案不为 (ax+by-1) ,一定存在 (a(x_0-x')+b(y_0-y') > a(x-x')+b(y-y')) 为答案,显然 (x_0 > x)(y_0 > y) ,所以一定有 (x_0 geq x+1 = x'_ ext{min})(y_0 geq y+1 = y'_ ext{min}) ,则一定存在 (x',y') 使得 (x_0-x'geq 0)(y_0-y' geq 0) ,故不存在 (x_0,y_0) ,所以答案为 (ax+by-1)

    #include <cstdio>
    
    int a, b;
    long long x, y;
    
    void exgcd(int a, int b, long long &x, long long &y) {
    	if (!b) {
    		x = 1;
    		y = 0;
    		return;
    	}
    	exgcd(b, a % b, y, x);
    	y -= a / b * x;
    }
    
    int main() {
    	scanf("%d%d", &a, &b);
    	exgcd(a, b, x, y);
    	x %= b;
    	if (x <= 0) x += b;
    	y %= a;
    	if (y <= 0) y += a;
    	printf("%lld
    ", a * (x - 1) + b * (y - 1) - 1);
    	return 0;
    }
    

    (O(1)) 做法

    (ans = ax + by(0 leq x < b))。(若 (x< 0)(xgeq b),则存在 (0 leq x' < b),使得 (ax equiv ax' pmod b),即 (ax+by = ax'+by')。故表示 (ans) 时可以限制 (0 leq x < b)
    (ans) 不能被表示出来,则 (y < 0)
    (x = b - 1,y = -1),显然 (ans) 最大。
    (ans = (b-1) imes a+(-1) imes b = ab-a-b)

    D2T3

    
    
  • 相关阅读:
    多进程
    NoSQL-memcached相关
    NoSQL-redis相关
    DB相关复习
    算法
    SQLAlchemy
    Mysql相关
    Python DB-API
    正则习题
    python的正则——re模块
  • 原文地址:https://www.cnblogs.com/kcn999/p/13887773.html
Copyright © 2011-2022 走看看