题链:

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

  

●CodeChef Sereja and Game的更多相关文章

  1. CodeChef Sereja and Game [DP 概率 博弈论]

    https://www.codechef.com/problems/SEAGM 题意: n个数(可能存在相同的数),双方轮流取数.如果在一方选取之后,所有已选取数字的GCD变为1,则此方输.问:1 若 ...

  2. CodeChef Sereja and LCM(矩阵快速幂)

    Sereja and LCM   Problem code: SEALCM   Submit All Submissions   All submissions for this problem ar ...

  3. CodeChef Sereja and GCD

    Sereja and GCD   Problem code: SEAGCD   Submit All Submissions   All submissions for this problem ar ...

  4. codechef January Challenge 2014 Sereja and Graph

    题目链接:http://www.codechef.com/JAN14/problems/SEAGRP [题意] 给n个点,m条边的无向图,判断是否有一种删边方案使得每个点的度恰好为1. [分析] 从结 ...

  5. Codechef SEAARC Sereja and Arcs (分块、组合计数)

    我现在真的什么都不会了呢...... 题目链接: https://www.codechef.com/problems/SEAARC 好吧,这题其实考察的是枚举的功力-- 题目要求的是\(ABAB\)的 ...

  6. codechef September Challenge 2017 Sereja and Commands

    ———————————————————————————— 这道题维护一下原序列的差分以及操作的差分就可以了 记得倒着差分操作 因为题目保证操作2的l r 小与当前位置 #include<cstd ...

  7. codechef January Challenge 2017 简要题解

    https://www.codechef.com/JAN17 Cats and Dogs 签到题 #include<cstdio> int min(int a,int b){return ...

  8. contest0 from codechef

    A  CodeChef - KSPHERES 中文题意  Mandarin Chinese Eugene has a sequence of upper hemispheres and another ...

  9. 【BZOJ-3514】Codechef MARCH14 GERALD07加强版 LinkCutTree + 主席树

    3514: Codechef MARCH14 GERALD07加强版 Time Limit: 60 Sec  Memory Limit: 256 MBSubmit: 1288  Solved: 490 ...

随机推荐

  1. 听翁恺老师mooc笔记(5)--指针与数组

    如果我们通过函数的参数将一个数组传递到参数中去,那么在函数里接收到的是什么东西呢?我们知道如果传递一个普通变量,那么参数接收到的是值,如果传递一个指针变量,参数接收到的也是值,只不过这时的值是地址.那 ...

  2. MySort实验报告

    实验日期:2017.5.2 实验内容:利用sort方法对已给的数据进行重新排序. 实验原图: 对原代码进行添加,补充新的内容: 在for循环中,新输入一个变量j,并新定义新的长度toSort.leng ...

  3. Linux安装mongodb总结

    由于自己的博客上线部署时需要用到mongodb来存储图片文件,所以先在本地电脑上安装了mongodb做测试,由于之前没接触过mongodb,所以安装过程中遇到了各种小问题,折腾了好久终于安装好并成功启 ...

  4. Angular组件——父组件调用子组件方法

    viewChild装饰器. 父组件的模版和控制器里调用子组件的API. 1.创建一个子组件child1里面只有一个greeting方法供父组件调用. import { Component, OnIni ...

  5. kubernetes进阶(04)kubernetes的service

    一.service概念 Service是对一组提供相同功能的Pods的抽象,并为它们提供一个统一的入口.借助Service,应用可以方便的实现服务发现与负载均衡,并实现应用的零宕机升级.Service ...

  6. javascript学习(3)循环和判断

    continue:: break:: 一.for循环 1.for(i=1;i<6;i++)循环 2.for(x in jsonObject)循环 二.while循环 1.while循环 2.do ...

  7. android- 远程调试

    最近由于要在另外一台android设备上调试代码,在本机PC上查看其log.两台机器离的比较远, 无法用usb直接连接,于是在网上找了很多资料,最找使用adb connect方法解决了该问题.解决过程 ...

  8. Python 爬虫基础知识

    requests Python标准库中提供了:urllib.urllib2.httplib等模块以供Http请求,但是,它的 API 太渣了.它是为另一个时代.另一个互联网所创建的.它需要巨量的工作, ...

  9. 测试驱动开发实践5————testSave之修改文档分类

    [内容指引] 1.确定"修改文档分类"的微服务接口及所需的参数 2.设计测试用例及测试用例合并 3.为测试用例赋值并驱动开发 上一篇我们通过17个测试用例完成了"新增文档 ...

  10. ORACLE数据库编程

    第一章 Oracle数据库基本概念 一.介绍 Oracle数据库系统是美国Oracle(甲骨文)公司提供的以分布式数据库为 核心的一组软件产品,是目前最流行的客户/服务器(Client/Server, ...