题链:

https://www.codechef.com/problems/SEAGM
题解:

概率dp,博弈论
详细题解:http://www.cnblogs.com/candy99/p/6504340.html
本体的先手胜与不胜(第一问)以及胜的概率(第二问)都是通过dp完成的,记忆化搜索实现。

定义了一个非常妙的dp状态:(第一问)
dp[g][c]表示当前选的数的gcd为g,且选了c个数时当前操作的人胜还是不胜。
有了这个状态,配合预处理的cnt[g]数组(表示有cnt[g]个数为g的倍数),
就可以很巧妙的实现dp转移:
0.if(g==1) dp[g][c]=1
1.if(c<cnt[g]&&!dp[g][c+1]) dp[g][c]=1
2.if(gcd(A[i],g)!=g&&!dp[gcd(A[i],g)][c+1]) dp[g][c]=1
第二问与第一问的方法相同,只是换成了随机情况下求概率而已。
(如果看不太懂各种解释,建议直接服用代码。2333)

代码:

#include<bits/stdc++.h>
#define MAXN 105
using namespace std;
int N,Case;
int A[MAXN],cnt[MAXN];
int opt[MAXN][MAXN];
double rad[MAXN][MAXN];
int gcd(int a,int b){
while(b^=a^=b^=a%=b);
return a;
}
int dfs_optimaly(int g,int c){
int &ret=opt[g][c];
if(g==1) ret=1;
if(ret!=-1) return ret;
ret=0;
if(c<cnt[g]&&!dfs_optimaly(g,c+1)) ret=1;
for(int i=1;i<=N;i++){
int gg=gcd(g,A[i]);
if(gg==g) continue;
if(!dfs_optimaly(gg,c+1)) ret=1;
}
return ret;
}
double dfs_randomly(int g,int c){
double &ret=rad[g][c];
if(g==1) ret=1;
if(ret>-0.5) return ret;
ret=0;
if(c<cnt[g]) ret+=1.0*(cnt[g]-c)/(N-c)*(1-dfs_randomly(g,c+1));
for(int i=1;i<=N;i++){
int gg=gcd(g,A[i]);
if(gg==g) continue;
ret+=1.0/(N-c)*(1-dfs_randomly(gg,c+1));
}
return ret;
}
int main(){
for(scanf("%d",&Case);Case;Case--){
scanf("%d",&N); int g=0;
for(int i=1;i<=N;i++) scanf("%d",&A[i]),g=gcd(g,A[i]);
if(g!=1){printf("%d %.4lf\n",N&1,1.0*(N&1)); continue;}
for(int i=0;i<=100;i++){
cnt[i]=0;
for(int j=0;j<=N;j++)
opt[i][j]=-1,rad[i][j]=-1;
}
for(int i=2;i<=100;i++)
for(int j=1;j<=N;j++)
if(gcd(i,A[j])==i) cnt[i]++;
printf("%d ",dfs_optimaly(0,0));
printf("%.4lf\n",dfs_randomly(0,0));
}
return 0;
}

  

最新文章

  1. Linux 平台GCC使用小结
  2. Salesforce练习Case
  3. centos下ssh无密码验证
  4. servlet的九大内置对象
  5. linux笔记_磁盘分区
  6. DXGI_FORMAT_R8G8B8A8_UNORM_SRGB
  7. Linux命令zip和unzip
  8. Google发布SSLv3漏洞简要分析报告
  9. 怎样通过iPhone Safari 来安装测试版ipa
  10. jqzoom基于jQuery的图片放大镜
  11. Eclipse TestNg插件
  12. java(jdk1.7) IO系列01之InputStream和OutputStream解析
  13. 在ASP.NET Core Web API中为RESTful服务增加对HAL的支持
  14. 命令:curl
  15. Mysql中判断一个点是否落在多边形内
  16. mina websocket 粘包、断包、(丢包)解决心得
  17. canvas高斯模糊算法
  18. 096实战 在windows下新建maven项目
  19. PAT 1017 A除以B
  20. ansible进阶小技巧--tags

热门文章

  1. 项目Alpha冲刺Day6
  2. Django 模型层
  3. 用python实现简单购物车功能
  4. android使用sharesdk的小感
  5. continue和break的特殊用法。
  6. Hibernate之Hibernate的下载与安装
  7. codves 3044 矩形面积求并
  8. nyoj Color the fence
  9. Vue 2.0基础语法:系统指令
  10. phalcon环境的搭建和dll扩展下载与选择