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