1. 程式人生 > 其它 >雜題

雜題

題面

1.每次給定 \(a,b,n\)\(num\) 初值為 \(1\),可以進行任意次操作,每次操作可以將 \(num ×a或+b\),求能否將 \(num\) 變為 \(n\)
一共進行 \(t\) 次詢問。(\(t≤10^5,1≤n,a,b≤10^9\))

2.現有長度為 \(1\) ~ \(N+1\) 的物品各一個,可以切割已選擇的物品(如將 \(x\) 切割為 \(x-a\)\(a\))。現要求選擇若干個物品使自己獲得 \(1\) ~ \(N\) 的物品各一個。求最少選擇多少個物品。\((1\le N\le 10^{18})\)

3.給定 \(n\) 個點 \(m\) 條邊的無向圖,邊權為正,求 \(1\)

\(n\) 的最短路有幾條。\((n,m\le 2×10^5)\)


題解

1.CF#729 Plus and Multiply
如果一個數 \(x\) 滿足 \((n-x)\%b==0\), 那麼就可以得到 \(n\)

這個式子也就是 \(n\%b == x\%b\)

考慮能不能得到這樣的 \(x\)

\(num\) \(+b\)肯定不能改變它的餘數,而對 \(num\) \(×a\)可以。

\(num\)初始為 \(1\),所以只要找有沒有 \(k\),滿足 \(a^k = x\), 即 \((a^k)\%b == n\%b\) 即可。

列舉 \(k\) 的時候保證 \(a^k≤n\)

,所以複雜度為 \(O(t·log_an)\)

2.ARC109B log
找到最大的 \(k\) 滿足 \(1+2+3+...+k\le N+1\),然後購買長度為 \(k\) ~ \(N+1\) 的原木即可。

因為 \(k+1\) ~ \(N\) 的長度可以直接對應,而長度為 \(1\) ~ \(k\) 的原木就可以被 \(N+1\) 分出來。

附:求 \(k\) 的時候可以二分,也可以這樣做:等差數列求和得到\(k\)是滿足 \(k(k+1)\le 2n+2\) 的最大值,所以先讓 \(k=\sqrt{2n+2}\),然後不斷讓 \(k++\) 直到滿足條件(迴圈次數不多)。

3.ABC211D Number of Shortest paths


邊權為正,在 \(dijkstra\) 的時候進行dp。具體地,設\(dp_u\)表示從 \(1\) 到達 \(u\) 的方案數,則\(dp_u=\sum\limits_{(dis_v+1=dis_u)} dp_v\),初始化 \(dp[1]=1\)