杂题
作者:互联网
题面
1.每次给定 \(a,b,n\),\(num\) 初值为 \(1\),可以进行任意次操作,每次操作可以将 \(num ×a或+b\),求能否将 \(num\) 变为 \(n\)。
一共进行 \(t\) 次询问。(\(t≤10^5,1≤n,a,b≤10^9\))
2.Snuke想要买长度为 \(1\) ~ \(N\) 的原木各一根,商店里有长度为 \(1\) ~ \(N+1\) 的原木各一根。Snuke可以切割他购买的原木,例如它可以把一根长度为 \(N\) 的原木分为长度为 \(N-1\) 和 \(1\) 的两根原木,而分出来的原木还可以再分。每根原木的价格都为 \(1\) ,求Snuke花费的最小值。\((1\le N\le 10^{18})\)
3.
题解
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\)表示从起点到达点\(u\)的方案数,则\(dp_u=\sum\limits_{(dis_v+1=dis_u)} dp_v\)
标签:le,可以,num,原木,长度,杂题,dp 来源: https://www.cnblogs.com/hzy1/p/15057115.html