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 个线段 ...
随机推荐
- 编写shell时,提示let/typeset:not found
刚刚开始接触linux shell 编程,脚本里面有一条let命令,在运行该脚本时却提示 let:not found 于是各种找自己写的脚本的问题,没发现错误,只好去网上百度,好心人告诉了我答案: / ...
- 解决jsp中编辑和删除时候弹出框闪退的问题。
---恢复内容开始--- /* 火箭设备特殊记载</li> <!-- yw4 --> */ function getYw4DL(){ var controlparm={&quo ...
- 对python-rrdtool模块的浅研究。
一,python-rrdtool模块安装. 切记!!! 这个rrdtool模块,在windows环境下安装太费劲,就是因为没安装上所以现在改成了在ubuntu环境下开发,原来没有体会过,现在可真是体会 ...
- HDU 5912 Fraction(模拟——分子式化简求解)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5912 Problem Description Mr. Frog recently studied h ...
- 从零开始学习前端开发 — 7、CSS宽高自适应
一.宽度自适应 语法:width:100%; 注: a)块状元素的默认宽度为100% b) 当给元素设置宽度为100%时,继承父元素的宽度 c) 通常使用宽度自适应实现通栏效果 二.高度自适应 语法: ...
- 基于VUE选择上传图片并在页面显示(图片可删除)
demo例子: 依赖文件 : http://files.cnblogs.com/files/zhengweijie/jquery.form.rar HTML文本内容: <template> ...
- php 使用 ffmpeg 转换视频,截图,并生成缩略图
http://blog.csdn.net/toss156/article/details/7003059 把ffmpeg 和 生成缩略图整合了一下. include("ImageResiz ...
- phpstudy本地搭建域名访问
http://blog.csdn.net/camillezj/article/details/54694554 步骤如下: 一.hosts配置: 1.用编辑器打开hosts文件,位置:C:\Windo ...
- 【开发技术】Xcode3与xcode4.2模板对比(Xcode4.2开发之一些变化)
Xcode3中IOS下的Application的模板如下: Navigation_Based Application OpenGL ES Application Tab Bar Application ...
- 用IDEA/WebStrom 提交本地项目到Git/码云等
以码云为例: 在码云上创建新的项目. webstrom/idea 打开本地项目