●CodeChef Sereja and Game
题链:
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的更多相关文章
- CodeChef Sereja and Game [DP 概率 博弈论]
https://www.codechef.com/problems/SEAGM 题意: n个数(可能存在相同的数),双方轮流取数.如果在一方选取之后,所有已选取数字的GCD变为1,则此方输.问:1 若 ...
- CodeChef Sereja and LCM(矩阵快速幂)
Sereja and LCM Problem code: SEALCM Submit All Submissions All submissions for this problem ar ...
- CodeChef Sereja and GCD
Sereja and GCD Problem code: SEAGCD Submit All Submissions All submissions for this problem ar ...
- codechef January Challenge 2014 Sereja and Graph
题目链接:http://www.codechef.com/JAN14/problems/SEAGRP [题意] 给n个点,m条边的无向图,判断是否有一种删边方案使得每个点的度恰好为1. [分析] 从结 ...
- Codechef SEAARC Sereja and Arcs (分块、组合计数)
我现在真的什么都不会了呢...... 题目链接: https://www.codechef.com/problems/SEAARC 好吧,这题其实考察的是枚举的功力-- 题目要求的是\(ABAB\)的 ...
- codechef September Challenge 2017 Sereja and Commands
———————————————————————————— 这道题维护一下原序列的差分以及操作的差分就可以了 记得倒着差分操作 因为题目保证操作2的l r 小与当前位置 #include<cstd ...
- codechef January Challenge 2017 简要题解
https://www.codechef.com/JAN17 Cats and Dogs 签到题 #include<cstdio> int min(int a,int b){return ...
- contest0 from codechef
A CodeChef - KSPHERES 中文题意 Mandarin Chinese Eugene has a sequence of upper hemispheres and another ...
- 【BZOJ-3514】Codechef MARCH14 GERALD07加强版 LinkCutTree + 主席树
3514: Codechef MARCH14 GERALD07加强版 Time Limit: 60 Sec Memory Limit: 256 MBSubmit: 1288 Solved: 490 ...
随机推荐
- 听翁恺老师mooc笔记(5)--指针与数组
如果我们通过函数的参数将一个数组传递到参数中去,那么在函数里接收到的是什么东西呢?我们知道如果传递一个普通变量,那么参数接收到的是值,如果传递一个指针变量,参数接收到的也是值,只不过这时的值是地址.那 ...
- MySort实验报告
实验日期:2017.5.2 实验内容:利用sort方法对已给的数据进行重新排序. 实验原图: 对原代码进行添加,补充新的内容: 在for循环中,新输入一个变量j,并新定义新的长度toSort.leng ...
- Linux安装mongodb总结
由于自己的博客上线部署时需要用到mongodb来存储图片文件,所以先在本地电脑上安装了mongodb做测试,由于之前没接触过mongodb,所以安装过程中遇到了各种小问题,折腾了好久终于安装好并成功启 ...
- Angular组件——父组件调用子组件方法
viewChild装饰器. 父组件的模版和控制器里调用子组件的API. 1.创建一个子组件child1里面只有一个greeting方法供父组件调用. import { Component, OnIni ...
- kubernetes进阶(04)kubernetes的service
一.service概念 Service是对一组提供相同功能的Pods的抽象,并为它们提供一个统一的入口.借助Service,应用可以方便的实现服务发现与负载均衡,并实现应用的零宕机升级.Service ...
- javascript学习(3)循环和判断
continue:: break:: 一.for循环 1.for(i=1;i<6;i++)循环 2.for(x in jsonObject)循环 二.while循环 1.while循环 2.do ...
- android- 远程调试
最近由于要在另外一台android设备上调试代码,在本机PC上查看其log.两台机器离的比较远, 无法用usb直接连接,于是在网上找了很多资料,最找使用adb connect方法解决了该问题.解决过程 ...
- Python 爬虫基础知识
requests Python标准库中提供了:urllib.urllib2.httplib等模块以供Http请求,但是,它的 API 太渣了.它是为另一个时代.另一个互联网所创建的.它需要巨量的工作, ...
- 测试驱动开发实践5————testSave之修改文档分类
[内容指引] 1.确定"修改文档分类"的微服务接口及所需的参数 2.设计测试用例及测试用例合并 3.为测试用例赋值并驱动开发 上一篇我们通过17个测试用例完成了"新增文档 ...
- ORACLE数据库编程
第一章 Oracle数据库基本概念 一.介绍 Oracle数据库系统是美国Oracle(甲骨文)公司提供的以分布式数据库为 核心的一组软件产品,是目前最流行的客户/服务器(Client/Server, ...