某考试 T1 fair (18.5.1版)

转化一下模型:每天可以选1也可以选0,但是任意前i天(i<=n)1的个数都必须>=0的个数,求总方案数/2^n。

然后可以发现这是一个经典题,随便推一下公式发现等于  C(n,n/2)/2^n  [请在二维平面直角坐标系上自行演算,(x,y)可以到 (x+1,y)和(x,y+1),横坐标代表1的个数,纵坐标代表0的个数,求不经过 y=x+1 这条直线的路径总数  (重点是 任意 (x,y) 满足 x+y==n 且 x>=y)]

本来以为卡卡常数就过去了23333,没想到竟然还要用 阶乘逼近公式!

那就记一下好啦,反正这玩意也根本没法理解啊qwq

当n很大 的时候,n! 与 sqrt(2*π*n) * (n/e)^n 之间的相对误差非常小(然鹅?),所以可以近似成相等啦

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#define ll long long
#define D double
using namespace std;
const D pi=acos(-1),E=exp(1);
D now=1,ans=1,B=log(4);
int n,hf;

inline void solve(){
	hf=n>>1;
	if(n&1){ ans=n/(D)(n-hf)/2,n--;}

	ans=log(ans);
	for(int i=hf+1;i<=n;i++) ans+=log(i)-log(i-hf)-B;
	ans=exp(ans);
}

inline D jc(int x){ return log(sqrt(2*pi*x))+x*log(x/E);}

inline void Sim(){
	ans=jc(n)-jc(n>>1)-jc(n-(n>>1))-log(2)*n;
	ans=exp(ans);
}

int main(){
	freopen("fair.in","r",stdin);
	freopen("fair.out","w",stdout);

	cin>>n;
	if(n<=1e6) solve();
	else Sim();
	printf("%.11lf\n",ans);
	return 0;
}

  

原文地址:https://www.cnblogs.com/JYYHH/p/8977247.html

时间: 2024-08-30 18:34:39

某考试 T1 fair (18.5.1版)的相关文章

16.1112 模拟考试 T1

加密[问题描述]有一种不讲道理的加密方法是: 在字符串的任意位置随机插入字符. 相应的,不讲道理的解密方法就是从字符串中恰好删去随机插入的那些字符.给定原文s和加密后的字符串t,求?有多少子串可以通过解密得到原文s.[输入格式]输入第一行包含一个字符串t,第二行包含一个字符串s.[输出格式]输出一行,包含一个整数,代表可以通过解密得到原文的s的子串的数量.[样例输入]abcabcabccba[样例输出]9[样例解释]用[?,?]表示子串开头结尾的下标(从 0 开始编号) ,这 9 种方案是:[0

某考试T1 game

题目背景 无 题目描述 Alice 和 Bob 在一个圆环上玩游戏.圆环上有 n 个位置,按照顺时针顺序 依次标号为 1 到 n.Alice 和 Bob 分别有一个数字集合,集合中都是在 [1, n?1] 内的正整数.游戏开始时会有一个棋子摆在圆环上的某个位置,然后两人轮流 行动.轮到某个人的回合时,他可以从他的集合中选出某个数 x,然后把棋子 沿顺时针方向移动 x 个位置.如果某个人把棋子移动到了 1 号位置,那么他就 获胜了.两个人都会以最优策略行动. 你需要对不同先后手顺序以及棋子初始位置

某考试 T1 sigfib

设 g(x) = f(x) * x ,多项式 A = Σ g(i) * x^i , 多项式  B = Σ f(i) * x^i. 首先,g(x) = g(x-1) + g(x-2) + f(x-1) + 2f(x-2),所以我们可以得到: A = x * A + x^2 * A + x * B + 2 * x^2 * B + x 又因为B是斐波那契数列的多项式,所以B的闭形式可以直接得到,就是  x/(1-x-x^2)   [这个也不难推,可以自己推推]. 于是我们可以开开心心的解出A的闭形式,

Ubuntu 18.04桌面版安装

安装方式:usb启动盘安装. 准备工具:a.启动盘制作工具:rufus  b.ubuntu 18.04 LTS镜像(如果下载慢,可以到国内找资源) 1.制作usb启动盘,直接运行rufus工具(绿色免安装),选择镜像点击开始.根据提示需要下载相关组件.根据提示即可完成.[本人在下载组件时因国外网络不稳定无法下载.可以通过rufus日志,找到需要的组件url自行下载即可使用] 2. 原文地址:https://www.cnblogs.com/yin5th/p/9049009.html

ubuntu 18.04 - server版 开机启动脚本

ubuntu 18.04 不再使用 inited 管理系统,改用 systemd systemd 默认读取 /etc/systemd/system 下的文件,该目录下的文件会链接/lib/systemd/system/下的文件. 执行 ls /lib/systemd/system 你可以看到有很多启动脚本,其中就有我们需要的 rc.local.service 打开脚本内容: [Unit] Description=/etc/rc.local Compatibility ConditionFileI

某考试 T1 Hello my friend

Discription 原文地址:https://www.cnblogs.com/JYYHH/p/8870108.html

某考试 T1 lcm

把lcm写成 (a+n)*(b+n) / gcd(a+n,b+n). 因为gcd可以辗转相减,所以就成了gcd(abs(a-b),a+n),一个常量一个变量之间的gcd,我们可以直接把abs(a-b)的所有约数找出来,然后看a要有某个约数的话n至少是多少,更新答案即可.(因为1e9以下的数的最多的约数的级别是1e3) #include<iostream> #include<cstdio> #include<algorithm> #include<cmath>

【考试】9.18

最近这题解是真不想写, 正好这次不太难,就放个代码吧 1>比赛 新奇的方法,但是我不想分析 精度操作很烦人 #include<cstdio> #include<cstdlib> #include<algorithm> using namespace std; int n; const int N=5e4+3; long long a[N],b[N]; long long sum[N],sq_sum[N],ans; int main() { scanf("

2020.3.1考试T1 多项式

出题人很凉心的把算法写成了题目名 首先我们可以发现每一维的贡献是独立的,这可以从 \(solve1\) 里看出来 然后我们可以考虑转化为 \(DP\) ,这可以从 \(solve2\) 里看出来 我们统计每一维能产生的贡献,就是 \(a\) 个 \(0\) 面, \(b\) 个 \(1\) 面, \(c\) 个 \(2\) 面这种形式,能写成一个多项式 \(ax^0+bx^1+cx^2\),而我们最终显然就是把所有的多项式都乘起来. 暴力一个一个乘就很 naive,分治 \(NTT\) 解决就好