codeforces 717 D. Dexterina’s Lab(矩阵快速幂加速dp,好题)
来源:互联网 发布:手机怎么给淘宝改评价 编辑:程序博客网 时间:2024/04/30 07:06
Dexterina and Womandark have been arch-rivals since they’ve known each other. Since both are super-intelligent teenage girls, they’ve always been trying to solve their disputes in a peaceful and nonviolent way. After god knows how many different challenges they’ve given to one another, their score is equal and they’re both desperately trying to best the other in various games of wits. This time, Dexterina challenged Womandark to a game of Nim.
Nim is a two-player game in which players take turns removing objects from distinct heaps. On each turn, a player must remove at least one object, and may remove any number of objects from a single heap. The player who can't make a turn loses. By their agreement, the sizes of piles are selected randomly from the range [0, x]. Each pile's size is taken independently from the same probability distribution that is known before the start of the game.
Womandark is coming up with a brand new and evil idea on how to thwart Dexterina’s plans, so she hasn’t got much spare time. She, however, offered you some tips on looking fabulous in exchange for helping her win in Nim. Your task is to tell her what is the probability that the first player to play wins, given the rules as above.
The first line of the input contains two integers n (1 ≤ n ≤ 109) and x (1 ≤ x ≤ 100) — the number of heaps and the maximum number of objects in a heap, respectively. The second line contains x + 1 real numbers, given with up to 6 decimal places each: P(0), P(1), ... , P(X). Here, P(i) is the probability of a heap having exactly i objects in start of a game. It's guaranteed that the sum of all P(i) is equal to 1.
Output a single real number, the probability that the first player wins. The answer will be judged as correct if it differs from the correct answer by at most 10 - 6.
2 20.500000 0.250000 0.250000
0.62500000
题意:
给出n,x,n (1 ≤ n ≤ 109) and x (1 ≤ x ≤ 100),表示一共n堆石子,没堆石子的个数在[1,x]范围内,然后给出x+1个浮点数,分别表示没堆石子个数为0,1,2...x的概率,两人玩Nim游戏,求先手必胜的概率。
题解:
Nim游戏先手必胜条件为每堆石子个数xor和不为0.
注意到x的范围比较小 x (1 ≤ x ≤ 100),可以记录当i堆石子确定时xor和为x的情况,那么
d[i][x]=d[i-1][x]*p0+d[i-1][x^1]*p1+...+d[i-1][x^n]*pn;
由于n比较大,可以用矩阵快速幂优化。
矩阵的构造自己画一下就知道了。由于xor和不会超过127,可以构造一个128*128的矩阵(0-127)。
#include<cstdio>#include<cstdlib>#include<algorithm>using namespace std;const int N=130;struct Matrix{ int n; double a[N][N]; Matrix(int in=0,int f=0) { n=in; for (int i=0;i<=n;i++) for (int j=0;j<=n;j++) a[i][j]=0; if (f==1) for (int i=0;i<=n;i++) a[i][i]=1; } double *operator [](int x) { return a[x]; } friend Matrix operator * (Matrix &A,Matrix &B) { int n=A.n; Matrix ret(n); for (int i=0;i<=n;i++) for (int j=0;j<=n;j++) for (int k=0;k<=n;k++) ret[i][j]+=A[i][k]*B[k][j]; return ret; } friend Matrix Pow(Matrix &A,int b) { Matrix ret(A.n,1); for (;b;b>>=1,A=A*A) if (b&1) ret=ret*A; return ret; }}A;int n,m;double a[1005];int main(){ scanf("%d%d",&n,&m); for (int i=0;i<=m;i++) scanf("%lf",a+i); A.n=127; for (int i=0;i<=127;i++) for (int j=0;j<=127;j++) A[j][j^i]=a[i]; A=Pow(A,n); printf("%.8lf\n",1-A[0][0]);}
- codeforces 717 D. Dexterina’s Lab(矩阵快速幂加速dp,好题)
- [矩阵快速幂加速DP] Codeforces 717D Bubble Cup 9 - Finals D. Dexterina’s Lab
- [矩阵快速幂加速DP]Codeforces 717D Bubble Cup 9 -Finals D. Dexterina’s Lab
- CodeForces 717 D.Dexterina’s Lab(博弈论+dp+矩阵快速幂)
- 【矩阵乘法优化DP】Codeforces 717D Dexterina’s Lab
- 【Nim游戏+DP+矩阵乘法】Codeforces717D[Dexterina’s Lab]题解
- Codeforces 118D Caesar's Legions【dp】好题
- CodeForces 696D AC自动机+DP+矩阵快速幂
- Codeforces Round #341 (Div. 2)E(矩阵快速幂优化dp,好题)
- Codeforces 691E Xor-sequences【矩阵快速幂,好题】
- Codeforces 691E Xor-sequences【矩阵快速幂,好题】
- codeforces 159D dp + strings 好题
- CodeForces 551 D.GukiZ and Binary Operations(dp+矩阵快速幂)
- POJ 3744 Scout YYF I 矩阵快速幂加速dp
- 利用矩阵快速幂加速二维dp hdu 5318
- 矩阵基础1010 UVA 11651 矩阵快速幂+DP 好题,推荐
- codeforces 118D Caesar's Legions (好题)
- [HDU 5411] CRB and Puzzle (矩阵加速DP + 前缀和矩阵|等比求和快速幂 )
- 快速理解简单工厂类模式
- Hadoop实战(四) 编写MR程序
- 行为识别笔记:improved dense trajectories算法(iDT算法)
- C++学习日记5
- Java多线程核心技术(四):Lock的使用
- codeforces 717 D. Dexterina’s Lab(矩阵快速幂加速dp,好题)
- 让机器人更安全——(1.藏在背后的知识)
- IDEA 导出java文档
- svn错误---cleanup
- 【前端js】时间与毫秒数互相转换
- 0227CSSS学习
- ButterKnife的配置使用详解
- C语言逗号表达式
- 网络基础一 之七层协议