[矩阵快速幂加速DP]Codeforces 717D Bubble Cup 9 -Finals D. Dexterina’s Lab

题目梗概

进行一个NIM游戏。

对于每一堆,出现数字X(1<=X<=100)的概率为ax。

求先手有必胜状态的概率。(堆数<=1e9)

解题思路

首先我们必须知道如果异或和为0为必输状态,否则必胜。

f[i][j] 表示前i堆,异或和为j的概率是多少。

转移关系是一定的。

f[i][jxork]+=f[i1][j]p[k]

显然可以构造矩阵优化。

#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=155;
struct jz{
    int n,m;
    double x[maxn][maxn];
}ans,w;
double p[maxn];
int n,x;
jz cheng(jz a,jz b){
    jz c;
    memset(c.x,0,sizeof(c.x));
    c.n=a.n;c.m=b.m;
    for (int i=0;i<=c.n;i++)
    for (int j=0;j<=c.m;j++)
    for (int k=0;k<=a.m;k++)
    c.x[i][j]+=a.x[i][k]*b.x[k][j];
    return c;
}
jz mul(jz w,int b){
    jz c;
    c.n=127,c.m=127;
    for (int i=0;i<128;i++)
    for (int j=0;j<128;j++) c.x[i][j]=(i==j);
    while(b>0){
        if (b%2==1) c=cheng(c,w);
        w=cheng(w,w);
        b=b>>1;
    }
    return c;
}
int main(){
    freopen("exam.in","r",stdin);
    freopen("exam.out","w",stdout);
    scanf("%d%d",&n,&x);
    for (int i=0;i<=x;i++) scanf("%lf",&p[i]);
    w.n=127;w.m=127;
    for (int i=0;i<128;i++)
    for (int j=0;j<=x;j++)
    w.x[i][i^j]=p[j];
    ans.n=0;ans.m=x;ans.x[0][0]=1;
    ans=cheng(ans,mul(w,n));
    printf("%.8lf\n",1.0-ans.x[0][0]);
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值