P3802 小魔女帕琪

题意:

洛谷链接

帕琪有七种元素,第 i 个元素有 ai 个,帕琪将所有元素排成一排,若有任意连续的 7 个元素互不相同(就是啥元素都有),就能释放魔法把蕾米淦翻。现在给你每个元素数量,问随机将元素排开期望能淦蕾米多少次。

注意是任意 7 个连续的,同一个元素在前 7 个中能组成,在后 7 个中也能组成,就算释放两次。如:12345671,即可释放两次。


纯数学题,想清题解后代码很好写。

总共期望释放几次 = 每个位置期望释放几次,当然每个位置只能释放一次。。。就是每个位置可释放的概率。

考虑到由于上一次是否释放对下一次没有任何影响,所以每个位置释放的概率都是独立的。

再思考会发现每个位置其实概率是一样的,因为都是在整个序列中连续的 7 个数,只是初始位置和结束位置不同而已。如果将这连续的 7 个数绑在一起,其他的元素全部散开,可以想到无论这 7 个放在哪里,概率都是相同的。

那么我们只需计算:长度为 n 的序列,选定的 7 个数互不相同的概率,答案乘上 n6 (有 n6 个可能释放的位置)。

但这 7 个数即使绑在一起他们之间的位置也不确定,既然这 7 个数互不相同,我们可以当做排列处理,将排好顺序的情况数乘上 7! ,就是位置不确定的情况。

现在问题变成了小学奥数。。。: n 个数中选出 7 个数,第一个数是 1,第二个数是 2,第三个数是 3 。。。的情况数。即 a1na2n1a3n2a4n3a5n4a6n5a7n6

综上:Ans=(n6)(7!)a1na2n1a3n2a4n3a5n4a6n5a7n6

Ans=5040a1na2n1a3n2a4n3a5n4a6n5a7

#include <algorithm> #include <iostream> #include <cstring> #include <cstdio> #include <cmath> #define QWQ cout<<"QwQ"<<endl; #define ll long long #include <vector> #include <queue> #include <stack> #include <map> using namespace std; const int N=201010; const int qwq=303030; const int inf=0x3f3f3f3f; double a[2333],tot; double ans = 5040.0; int main() { for(int i=1;i<=7;i++) scanf("%lf",&a[i]), tot += a[i]; for(int i=1;i<=7;i++) if(!a[i]) { cout<<"0.000"; return 0; } for(int i=1;i<=7;i++) ans = ans * a[i] / (tot-i+1); ans *= tot-6; printf("%.3lf",ans); return 0; }

__EOF__

本文作者枫叶晴
本文链接https://www.cnblogs.com/maple276/p/12811549.html
关于博主:菜菜菜
版权声明:呃呃呃
声援博主:呐呐呐
posted @   maple276  阅读(138)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示