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 个线段 ...
随机推荐
- 了解 Python 语言中的时间处理
python 语言对于时间的处理继承了 C语言的传统,时间值是以秒为单位的浮点数,记录的是从1970年1月1日零点到现在的秒数,这个秒数可以转换成我们日常可阅读形式的日期和时间:我们下面首先来看一下p ...
- [学习OpenCV攻略][003[初试牛刀——显示图片]
cvLoadImage(路径) 加载指定路径的图片到内存 cvNamedWindow("窗口名称", 属性) 创建窗口,窗口名称用来被其他函数引用,属性:0表示窗口大小不变,CV_ ...
- Dora.Interception, 为.NET Core度身打造的AOP框架[4]:演示几个典型应用
为了帮助大家更深刻地认识Dora.Interception,并更好地将它应用到你的项目中,我们通过如下几个简单的实例来演示几个常见的AOP应用在Dora.Interception下的实现.对于下面演示 ...
- jquery 图片自动无缝滚动
<!DOCTYPE html><html><head> <meta charset="utf-8"> <meta http-e ...
- HttpUrlConnection使用与总结
/* * URL请求的类别分为二类,GET与POST请求.二者的区别在于: * a:) get请求可以获取静态页面,也可以把参数放在URL字串后面,传递给servlet, ...
- Java Reflection 反射基础
反射基础: package reflection; /** * Created by : Infaraway * DATE : 2017/3/2 * Time : 23:06 * Funtion : ...
- myeclipse 10怎么安装与激活
http://jingyan.baidu.com/article/5553fa82eae0ce65a2393406.html
- int指令
body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...
- CDN页面刷新接口定义[高升]
一 . 任务 分发 工作流程步骤 1. 合作方按照高升定义的 json 数据格式向高升分发接口 post 任务,高升分发接口会根据接收情况即时反馈接收成功还是失败的结果.二 . 高升 分发 接口 定义 ...
- JQuery判断是否为空
//有如下三种判断 var A=$("#**).val(); if(A==null||A!=undefined||A==""){ //处理 } //参考文章1说下面方法效 ...