CodeChef Sereja and Game [DP 概率 博弈论]
https://www.codechef.com/problems/SEAGM
题意:
n个数(可能存在相同的数),双方轮流取数。如果在一方选取之后,所有
已选取数字的GCD变为1,则此方输。
问:
1 若双方均采取最优策略,先手是否必胜?
2 若双方随机取数,先手获胜的概率为多少?
$n,ai \le 100$
状态比较难想,核心是找到一个划分阶段的顺序:根据$GCD$划分阶段
$GCD$是只会减小不会增加的
课件上的状态是$f[i][j]$表示当前$GCD$为$i$,没选的$i$的倍数有$j$个,感觉有点奇怪...
看了一下官方题解,意识到只要记录$j$为当前已经选的有$j$个就好了,已经选的一定是$i$的倍数,这样就和其他的状态比较像了
转移还是比较好想的
$1.\ f[i][j] \rightarrow f[i][j+1]\ :\ j<mult[i]$
$2.\ f[i][j] \rightarrow f[gcd(i,k)][j+1]\ :\ 1 \le gcd(i,k) \le i$
记忆化搜索倒推就行了
PS:给$gcd$加上记忆化之后$0s$就跑过去了....
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
const int N=;
const double eps=1e-;
inline int read(){
char c=getchar();int x=,f=;
while(c<''||c>''){if(c=='-')f=-;c=getchar();}
while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
return x*f;
}
int n,a[N];
int g[N][N];
int gcd(int a,int b){return g[a][b] ? g[a][b] : g[a][b]=(b==?a:gcd(b,a%b));}
//int gcd(int a,int b){return b==0?a:gcd(b,a%b);}
int f[N][N];
double p[N][N];
bool dfsWin(int u,int c){//printf("dfsWin %d %d\n",u,c);
int &re=f[u][c];
if(c==n) re=;//has chosen all
if(u==) re=;//win
if(re!=-) return re; re=;
int mult=;
for(int i=;i<=n;i++) if(gcd(u,a[i])==u) mult++;
if(c<mult&&!dfsWin(u,c+)) re=;
else{
for(int i=;i<=n;i++)
if(gcd(u,a[i])>&&gcd(u,a[i])!=u)
if(!dfsWin(gcd(u,a[i]),c+)) {re=;break;}
}
return re;
}
double dfsPro(int u,int c){//printf("dfsPro %d %d\n",u,c);
double &re=p[u][c];
if(c==n) re=0.0;
if(u==) re=1.0;
if(re>-0.9) return re; re=0.0;
int mult=;
for(int i=;i<=n;i++) if(gcd(u,a[i])==u) mult++;
if(c<mult) re+= (double)(mult-c) / (n-c) * (-dfsPro(u,c+));
for(int i=;i<=n;i++)
if(gcd(u,a[i])>&&gcd(u,a[i])!=u)
re+=(double) / (n-c) *(-dfsPro(gcd(u,a[i]),c+));
if(abs(re)<eps) re=;
return re;
}
int main(){
freopen("in","r",stdin);
int T=read();
while(T--){
n=read(); int g=;
for(int i=;i<=n;i++) a[i]=read(),g=gcd(a[i],g);
if(g>){printf("%d %.4lf\n",n&,double(n&));continue;} for(int i=;i<N;i++) for(int j=;j<N;j++) f[i][j]=-,p[i][j]=-1.0;
int flag=dfsWin(,);
printf("%d ",flag); double prob=dfsPro(,);
printf("%.4lf\n",prob);
}
}
CodeChef Sereja and Game [DP 概率 博弈论]的更多相关文章
- ●CodeChef Sereja and Game
题链: https://www.codechef.com/problems/SEAGM题解: 概率dp,博弈论 详细题解:http://www.cnblogs.com/candy99/p/650434 ...
- UVA 11427 Expect the Expected(DP+概率)
链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=35396 [思路] DP+概率 见白书. [代码] #include&l ...
- tyvj P1864 [Poetize I]守卫者的挑战(DP+概率)
P1864 [Poetize I]守卫者的挑战 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 打开了黑魔法师Vani的大门,队员们在迷宫般的路上漫无目的地搜 ...
- [LnOI2019]加特林轮盘赌(DP,概率期望)
[LnOI2019]加特林轮盘赌(DP,概率期望) 题目链接 题解: 首先特判掉\(p=0/1\)的情况... 先考虑如果\(k=1\)怎么做到\(n^2\)的时间复杂度 设\(f[i]\)表示有\( ...
- poj 2096 Collecting Bugs(期望 dp 概率 推导 分类讨论)
Description Ivan is fond of collecting. Unlike other people who collect post stamps, coins or other ...
- BZOJ 3566: [SHOI2014]概率充电器 [树形DP 概率]
3566: [SHOI2014]概率充电器 题意:一棵树,每个点\(q[i]\)的概率直接充电,每条边\(p[i]\)的概率导电,电可以沿边传递使其他点间接充电.求进入充电状态的点期望个数 糖教题解传 ...
- BZOJ 1415: [Noi2005]聪聪和可可 [DP 概率]
传送门 题意:小兔子乖乖~~~ 题意·真:无向图吗,聪抓可,每个时间聪先走可后走,聪一次可以走两步,朝着里可最近且点编号最小的方向:可一次只一步,等概率走向相邻的点或不走 求聪抓住可的期望时间 和游走 ...
- Codeforces1097D. Makoto and a Blackboard(数论+dp+概率期望)
题目链接:传送门 题目大意: 给出一个整数n写在黑板上,每次操作会将黑板上的数(初始值为n)等概率随机替换成它的因子. 问k次操作之后,留在黑板上的数的期望. 要求结果对109+7取模,若结果不是整数 ...
- Codeforces 425E Sereja and Sets dp
Sereja and Sets 我们先考虑对于一堆线段我们怎么求最大的不相交的线段数量. 我们先按 r 排序, 然后能选就选. 所以我们能想到我们用$dp[ i ][ j ]$表示已经选了 i 个线段 ...
随机推荐
- POJ_1064 二分搜索
/*POJ 1064 *题目大意:有N条绳子,他们的长度分别为Li,如果从他们中切割K条长度相同的绳子的话,这K条绳子每条最长能有多长?答案保留到小数点后2位 *算法分析:这个问题用二分搜索可以非常容 ...
- 让BLE设备的名称包含MAC地址
对于研发和测试BLE来说,经常看到同名的设备,是极为不方便的,一大堆设备同时上电会让同事不知道哪一个设备才是自己真正想操作的目标.再说一下小米手环,家中有三支小米手环,打开设备搜索全是“MI”,都不知 ...
- 注意SSIS中的DT_NUMERIC类型转换为字符类型(比如DT_WSTR)时,会截断小数点前的0
我们知道SSIS中有许多数据类型,如下图所示: 但是DT_NUMERIC这个类型有个陷进要注意,我们来做个实验,随便定义一个String类型的SSIS包变量,然后打开该变量表达式窗口: 在变量表达式窗 ...
- sql for xml 输出结果带单引号出现转成&apos的解决方案
select '''' + ID +''',' from 表 for xml path('') 此SQL语句,输出结果如‘1’,’2‘,’3‘, 但是在因xml会出现path转译的问题将‘转成&am ...
- 阿里云部署SSL证书详解
http://mp.weixin.qq.com/s/NV7Zad4DVEgzG2GCHYJVLw 查找中间证书 为了确保兼容到所有浏览器,我们必须在阿里云上部署中间证书,如果不部署证书,虽然安装过程可 ...
- 织梦首页、列表页调用文章body内容的两种方法
http://blog.csdn.net/langyu1021/article/details/52261411 关于首页.列表页调用文章body内容的两种方法,具体方法如下: 第一种方法: {ded ...
- 实现LNMP
实现LNMP 环境: linux系统机器 A:一台N:nginx,ip:192.168.213.251 B:一台P:php-fpm,php-mysql ,ip:192.168.213.253 C:一台 ...
- 源码讲解 node+mongodb 建站攻略(一期)第二节
源码讲解 node+mongodb 建站攻略(一期)第二节 上一节,我们完成了模拟数据,这次我们来玩儿真正的数据库,mongodb. 代码http://www.imlwj.com/download/n ...
- java基础学习总结——java读取properties文件总结
摘录自:http://www.cnblogs.com/xdp-gacl/p/3640211.html 一.java读取properties文件总结 在java项目中,操作properties文件是经常 ...
- 静态html制作之psd转html
很多时候我们开发拿到的是psd文件,这个时候如果公司有前端,会帮你制作成静态html, 很多小公司是没有这个配置的,所以只能业务开发的自己上马.可以有多种实现方式: 1.对于简单的切图,可以在线网站切 ...