这里的意思是想让我们求得是否是能够实现不停地无上限的赚钱。
这里注意避开一个思维误区,如果你想的是前x次一直用1枚硬币然后吃第x+1次保底,那么就是错误的。你应该考虑到如果前x次里面出现了胜利呢?这时候你拿着一枚硬币根本赚不回本。
所以我们要假定:前x+1次,每一次都有可能胜利,并且每次胜利我们都需要使得自己能够赚回本金并且获得利润。
那么我们要怎么做才能够实现?
这里假设我们第i次投入的硬币数量为 C i C_i Ci,那么在投入m次之后,如果现在我们恰巧胜利了,那么我们需要赚回的硬币至少要大于: ∑ i = 1 m − 1 C i \sum_{i = 1}^{m-1} C_i i=1∑m−1Ci
而当前我们投入的硬币是
C
m
C_m
Cm,那么我们就可以得到:
C
m
∗
(
k
−
1
)
>
∑
i
=
1
m
−
1
C
i
C_m*(k - 1) > \sum_{i = 1}^{m-1} C_i
Cm∗(k−1)>i=1∑m−1Ci
就可以知道
C
m
>
∑
i
=
1
m
−
1
C
i
k
−
1
C_m > \frac{\sum_{i = 1}^{m-1} C_i}{k-1}
Cm>k−1∑i=1m−1Ci
而这个m就代表了前x+1次里面的每一次我们都要这么计算,只需要维护一个前缀和变量就可以了,如果到x+1中间出现了花费大于本金,那么就一定没办法一直赚钱。
void solve(){
int k,x,a;cin >> k >> x >> a;
int s = 0;
for(int i = 1;i <= x + 1;i++){
s += s/(k - 1) + 1;
if(s > a){
cout << "NO\n";
return;
}
}
cout << "YES\n";
}