UVAlive 5863 Probability Computation 题解

39 篇文章 0 订阅

题目

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值