• loj2314 「NOIP2017」小凯的疑惑[同余最短路or数论]


    这题以前就被灌输了“打表找规律”的思想,所以一直没有好好想这道题,过了一年还不太会qwq。虽然好像确实很简单,但是还是带着感觉会被嘲讽的心态写这个题解。。。而且还有一个log做法不会。。。

    法1:(一开始没看懂,后由hkk神仙教导ORZ)

    因为$ax+by=k$如果无视${x,y}$非负整数解的条件的话,显然由于$gcd(a,b)=1$,所以所有$k$都可以表出。那么依题意如果有$k$不可以表出,是因为受了题目非负整数解条件的限制,也就是$x<0,y<0$,又因为$x,y$不可能同时$<0$,所以就是要求$x,y$异号表出的最大$k$。不妨让$a$项的$x$为负,那么为了保证$x,y$所有的通解都是一正一负,必定可以得出最后取模简化后必须要有$ain (-b,0),bin (0,a)$(由扩欧得到,不在这个范围也可以取模得到)。为了最大,$x$必须为$-1$,$b$项必须为$a-1$,这样就可以保证$k$最大了。

    所以$k=-a+(a-1)b=ab-a-b$。

    法2:(同余类最短路)

    有关同余类最短路我在这里写了一下,这里就不啰嗦了。然后根据这个原理,假设$a<b$,设$f[i]$表示$min{kb|kbmod=i}$,也就是最小可以用$b$的倍数表出的、模$a$余数为$i$的数。这个可以和套路一样建边跑最短路,最后按套路找$max{f[i]-a}$就行了。但是这里数据规模很大。但是有一个特殊性质,$gcd(a,b)=1$,并且这个最短路实际就是从$f[0]$到$f[bmod a]$到$f[2bmod a]$,往后跑一条链......所以这个dis越跑越大,一直跑到$f[abmod a]=f[0]$发现没法松弛,终止。显然可证中间不会出现$f[kbmod a]=f[0],kin[1,a-1]$。那么可以直接得出结论在最后一次$f[(a-1)bmod a]$的dis最大,因此答案就是$f[(a-1)bmod a]-a=(a-1)b-a=ab-a-b$.

    a,b=map(int,input().split())
    print(a*b-a-b)
  • 相关阅读:
    【CLR Via C#】2 程序集
    值类型与引用类型
    .Net Framework简介
    【CLR Via C#】15 枚举类型与位类型
    Dictionary的用法及用途
    枚举
    GitExtensions使用教程
    Bootstrap如何禁止响应式布局
    【StyleCop】StyleCop规则汇总
    优化SQL查询:如何写出高性能SQL语句
  • 原文地址:https://www.cnblogs.com/saigyouji-yuyuko/p/11600343.html
Copyright © 2020-2023  润新知