Soratosorato

UVA557 Burger 题解

Sorato·2024-03-22 13:10·22 次阅读

UVA557 Burger 题解

UVA557 Burger

题目大意#

称一个长度为 n 的01串是好的,当且仅当 01 在该串中分别出现恰好 n2 次,且该串的最后两位相同。

现给定 nn 为偶数),求 该串是好的 的概率。

Solve#

正难则反,考虑求出最后两位不同的概率。

m=n2,那么条件“最后两位不同”等价于前 2m2 位中,有 m101

显然该串满足此条件的概率是:

Pn=(2m2m1)22m2=(n2n21)2n2

即从前 2m2 位中选出 m1 位令其为 0 的方案数除以总方案数。而每一位上是 01 有两种选择,所以共有 22m2 种方案。

所以最后的答案就是 1P 了。

然后考虑怎么求组合数,显然不能利用递推求,时间和空间上都过不去,而用阶乘和逆元的话,我不会。

考虑手推个递推式,因为我们发现只需求 (2ii),显然不难推。

(1)(2ii)=(2i)!i!×i!=2i×(2i1)××(i+1)i!(2)(3)(2i2i1)=(2i2)!(i1)!×(i1)!(4)=(2i2)×(2i1)××i(i1)!(5)(6)(2ii)(2i2i1)=2i×(2i1)i×i=2(2i1)i(7)(2ii)=2(2i1)i(2i2i1)(8):(9)(ii2)=2(i1)i2(i2i21)=4(i1)i(i2i21)(10)(11)Pi=(i2i21)2i2(12)Pi+2=(ii2)2i=4(i1)i(i2i21)2i=(i1)i(i2i21)2i2=(i1)iPi(13):(14)Pi=Pi2×(i1)÷i

代码就很简单了。

Code#

Copy
#include<bits/stdc++.h> #pragma GCC optimize(1,2,3,"Ofast","inline") using namespace std; #define int long long inline int read() { short f=1; int x=0; char c=getchar(); while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();} while(c>='0'&&c<='9') x=(x<<1)+(x<<3)+(c^48),c=getchar(); return x*f; } int t,n,mi,m; double ans[100010]={1}/*C(i/2,i)*/; signed main() { for(int i=2;i<=100000;i+=2) ans[i]=ans[i-2]*(i-1)/i; t=read(); for(int i=1;i<=t;i=-~i) printf("%.4lf\n",1-ans[read()-2]); return 0; }
posted @   Sorato  阅读(22)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
点击右上角即可分享
微信分享提示
目录