BZOJ2134: 单选错位
【传送门:BZOJ2134】
简要题意:
给出n道题目,每道题目有a[i]个选项
有一个人知道所有题目的正确选项,但是他把答案全部写在了第i+1的题目上(第n个题目的答案写在了第1个题目上)
求出这个人做对题目的期望
题解:
期望DP,有一点点水
首先对于a[i-1]和a[i]而言,假设要答对第i道题的话,那么概率就是min(a[i-1],a[i])/(a[i-1]*a[i])(a[i-1]*a[i]为方案总数)
但是a[i-1]*a[i]会暴int,所以我们简化为1.0/max(a[t],a[i]),然后没了
参考代码:
#include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> #include<cmath> using namespace std; typedef long long LL; int a[11000000]; double f[11000000]; int main() { int n,A,B,C; scanf("%d%d%d%d%d",&n,&A,&B,&C,&a[1]); for(int i=2;i<=n;i++) a[i]=((LL)a[i-1]*A+B)%100000001; for(int i=1;i<=n;i++) a[i]=a[i]%C+1; for(int i=1;i<=n;i++) { int t=i-1;if(t==0) t=n; f[i]=f[t]+1.0/max(a[t],a[i]); } printf("%.3lf\n",f[n]); return 0; }
渺渺时空,茫茫人海,与君相遇,幸甚幸甚