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;
}

 

posted @ 2018-04-10 11:31  Star_Feel  阅读(196)  评论(0编辑  收藏  举报