UVAlive 5863 Probability Computation 题解

题目

Tri_integral Summer Training 4

题意:

一个n位的二进制数x,已知每一位为1或0的概率,求x mod q==r的概率。

题解:

以dp[i][j]表示i位及i位之前的数模q为j的概率,那么转移时向加0和加2^i转移,最后dp[n][r]为答案。

 


//Time:9ms
//Memoty:0KB
//Length:1019B
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <cstring>
#include <set>
#define MAXN 210
#define INF 1000000007
#define MP(x,y) make_pair(x,y)
#define FI first
#define SE second
using namespace std;
double dp[2][MAXN];
int p[MAXN];
int main()
{
    //freopen("/home/moor/Code/input","r",stdin);
    int r,q,s,n,ncase,step;
    scanf("%d",&ncase);
    while(ncase--)
    {
        scanf("%d",&n);
        for(int i=0;i<n;++i)    scanf("%d",&p[i]);
        scanf("%d%d",&q,&r);
        for(int i=0;i<2;++i)
            for(int j=0;j<q;++j)
                dp[i][j]=0;
        s=0;
        dp[s][0]=1;
        step=1;
        for(int i=n-1;i>=0;--i)
        {
            for(int j=0;j<q;++j)
                dp[!s][j]=0;
            for(int j=0;j<q;++j)
                dp[!s][j]+=dp[s][j]*(100.0-p[i])/100.0,
                dp[!s][(j+step)%q]+=dp[s][j]*p[i]/100.0;
            s=!s;
            step=(step*2)%q;
        }
        printf("%.5f\n",dp[s][r]);
    }
    return 0;
}


你可能感兴趣的:(UVAlive 5863 Probability Computation 题解)