1. 程式人生 > >Noip2017提高組Day1

Noip2017提高組Day1

不知不覺自己退役兩年了呢。。

小凱的疑惑

[Problem]

小凱手中有兩種面值的金幣,兩種面值均為正整數且彼此互素。 每種金幣小凱都有
無數個。 在不找零的情況下, 僅憑這兩種金幣,有些物品他是無法準確支付的。 現在小
凱想知道在無法準確支付的物品中,最貴的價值是多少金幣? 注意:輸入資料保證存在
小凱無法準確支付的商品。

[Solution]
假設面值分別為a, b
Ans = a*b - (a + b)
證明:
我們假設a < b, 又Gcd(a,b) = 1;
那麼a % b, 2 * a % b, 3 * a % b ……(b-1) * a % b 均不相同
即ak % b 均不相同,其中1<= k < b
這個結論不知道可以看一下hdu5514這道題目
我們把整個數集按照模b結果分為b類
對於任意整數x
若x%b=0,顯然可以湊出
若x%b=1,滿足條件的最小x為k*a,其中k * a % b = 1,而對於k *a + b、k *a+2 *b…..都可以通過減去若干b,最終成為ka來湊出,那麼此類數最大湊不出的是什麼呢? k *a -b,其中ka%b=1
若x%b = 2,同理最大湊不出的數為ka-b,其中ka %b = 2
….
以此類推
若x%b=t, 最大湊不出的數為ka-b,其中ka%b=t
因此ans=max(ka-b) = a(b-1)-b = a*b - (a + b)

逛公園

[Solution]
我們可以觀察到k很小,假設從第一個點到第i個點的最短距離為t,那麼我們只需要保留到第i個點距離為t~t+k的方案即可,因此我們用f[i][j]表示從第一個點到第i個點距離為t+j的方案數
我們首先tarjan縮點,然後形成DAG圖,最後跑一邊dp即可
對於每一個f[i],加入i與x有連邊,那麼拿f[i]的最優解去更新f[x],如果i這個點是個環,一圈的權值為t,那麼把每個f[i][j]累加到f[i][j + t]中即可
複雜度O(nk+mK^2)