「CF1929C」 Sasha and the Casino
题意
最开始有 \(a\) 个金币,每次你可以选择 \(y\in[1,a]\) 个金币交给赌场赌博,赌场决定胜负(反正不是你决定)。如果胜,就获得 \(ky\) 个金币;否则获得 \(0\) 个金币。赌场保证你最多连输 \(x\) 次。
有 \(t\) 组询问,每次给出 \(k,x,a\),求是否能获得任意数量的金币。
分析
对于小于等于当前数量的金币数,肯定可以一次获得。
所有我们只要求是否能在 \([1,x]\) 次内使金币数增加。
设第 \(i\) 次赌博投入 \(c_i\) 个金币,其中 \(c_0\) 肯定为 \(1\)。
对于已经输了 \(i\) 次的一次赌博,如果本局赢且能增加数量,那么肯定满足 \(\sum\limits^{i+1}_{j=0}c_j<k\times c_{i}\)。
消掉一个 \(c_{i}\),移项得 \(\frac{\sum\limits^{i-1}_{j=0}c_j}{k-1}<c_{i}\)。
所以得 \(c_{i}\) 最小为 \(\lfloor \frac{\sum\limits^{i-1}_{j=0}c_j}{k-1}\rfloor+1\)。
其中 \(\sum\limits^{i-1}_{j=0}c_j\) 可以用前缀和处理。循环 \(1\sim x\),判断当前若 \(sum>a\),即花销大于拥有的数了,就直接输出 NO
。
总时间复杂度 \(O(tx)\)。
Code
#include<bits/stdc++.h> typedef long long ll; using namespace std; #define dbg(x) cout<<#x<<": "<<x<<"\n" inline ll read(){ll x=0,f=1;char c=getchar();while(c<48||c>57){if(c==45)f=0;c=getchar();}while(c>47&&c<58)x=(x<<3)+(x<<1)+(c^48),c=getchar();return f?x:-x;} const ll mod=998244353,maxn=1e2+5,maxt=505; ll t,k,x,a,s,c[maxn]={1}; inline void solve(){ k=read(),x=read(),a=read(),s=1; for(ll i=1;i<=x;++i){ c[i]=s/(k-1)+1; if(s>a){puts("NO");return;} s+=c[i]; } if(s<=a)puts("YES"); else puts("NO"); return; } signed main(){ t=read(); while(t--)solve(); return 0; }
本文作者:run-away
本文链接:https://www.cnblogs.com/run-away/p/18144017
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步