E.
杀了我个措手不及的记忆化搜索。
首先观察 \(N \leq 10^{18}.\) 但是这却是个不用矩快的 \(DP.\)
设 \(f[x]\) 为 \(x\) 的答案。
有以下两种决策:
第一种:\(f[x]=f[x/A]+X\),也就是直接执行第一种方案。
第二种:掷出 \(Dice\),然后考虑 \(Dice\) 的期望。
\(f[x]=\dfrac{f[x]+f[x/2]+f[x/3]+f[x/4]+f[x/5],f[x/6]}{6}+Y\)
解方程。解得:
\(f[x]=\dfrac{5}{6}(f[x/2]+f[x/3]+f[x/4]+f[x/5],f[x/6])+Y\)
然后考虑继续优化:注意到 \(x\) 常有重复,并且每一个 \(f[x]\) 在单独的题目情况下恒定。所以记忆化搜索。
注意开 \(\texttt{long long, long double.}\)
程式
#include <bits/stdc++.h>
#define db long double
#define ll long long
using namespace std;
map<ll,db> mp;
ll N,A,X,Y;
db f(ll x){ if(mp[x]) return mp[x]; if(!x) return 0; return mp[x]=min(X+f(x/A),(f(x/2)+f(x/3)+f(x/4)+f(x/5)+f(x/6)+6*Y)/5.0); }
int main(){
scanf("%lld%lld%lld%lld",&N,&A,&X,&Y);
printf("%Lf\n",f(N));
return 0;
}