概率生成函数

摘要:
一种人为指定的函数被设置为项目的概率,那么生成函数[F=sum_{igeq0}F*x^i]part1具有一些性质。如果项目的值为,那么这个事件的期望值是[sum_{igeq0}i*f]我们发现[f'=sum_{igeq0}i*f*x^{i-1}][f'=sum_{igeq0}i*f=E]$2:$variance$val=$f''+f'-f'^2$已知方差是[E(x^2)-E^2]E(x^2)=sum_{igeq0}i^2*f][f''=sum{igeq1}i*(i-1)*f*x^ i-2}]分解公式[E(x^2)=f''+f'][E(x^2)-E^2=f''+f'-f'^2]。。。
part0 What is it ?

一类人为规定的函数

(f(i)) 为第 (i) 项的概率

那么设 (F(x))(f) 的生成函数

[F(x) = sum_{i geq 0} f(i) * x ^ i ]

part1 一些性质

(1: F'(1) = E(x))

假如第 (i) 项的值为 (i)

则这件事情的期望 (E)

[sum_{i geq 0} i * f(i) ]

我们发现

[F'(x) = sum_{i geq 0} i * f(i) * x ^ {i - 1} ]

[F'(1) = sum_{i geq 0} i * f(i) = E(x) ]

$2 : $ 方差 $val(x) = $ $ F''(1) + F'(1) - F'(1) ^ 2 $

已知方差为

[E(x^2) - E(x)^2 ]

那么

[E(x^2) = sum_{i geq 0} i ^ 2 * f(i) ]

[F''(x) = sum_{i geq 0} i * (i - 1) * f(i) * x ^ {i - 2} ]

把式子拆开

[E(x^2) = F''(x) + F'(x) ]

[E(x^2) - E(x)^2 = F''(x) + F'(x) - F'(x) ^ 2 ]


然后就是做题了。。。

P4548 [CTSC2006] 歌唱王国

暴力

就是建一个KMP自动机,高斯消元

正解

我们先设几个变量, (A) 表示名字序列,(m) 表示随机数生成器范围, (L) 表示名字长度

(f(i)) 表示序列在第 (i) 处结束的概率,答案就是 $ sumlimits_{i geq 0} i * f(i)$

我们发现这玩意有无穷多项,考虑使用概率生成函数

(F(X))(f) 的生成函数,答案就是 (F'(1))

这样还是毫无思绪,我们考虑上网搜题解

题解告诉我们,这种类型的题讲究套路,那我们就用套路

设 $g(i) $ 为序列长为 (i) 但没有结束的概率,它的生成函数为 (G(x))

对于 (G(x)) 此时序列还没有结束,我们往里面随便放一个数 (G(x) * 1 * x) 此时它可能结束,也可能没结束,那它就等于 (F(x) + G(x)) ,这样的话里面一定有字母,我们就少统计了 (f(0), g(0)) ,把它们加进去,(f(0) = 0, g(0) = 1) 此时我们得出一个等式

[F(x) + G(x) = 1 + G(x) * x ]

里面有两个未知量,我们还要再搞出一个

对于一个 (G(x)) 我们把一个人的名字 (A) 序列放进去,这时候序列一定结束了,但对于每一个未放完序列 (g(i)) 不一定是在 (i + |A|) 处结束,还可能更早

比如序列 (g(i)) 放入 (|A|) 后,在 (j (j > i)) 处结束,那他的概率就是

[g(i) * (frac 1 m) ^ L = f(j) * (frac 1 m) ^ {L - j} ]

序列在 (j) 处结束当且仅当 $A[1, (j - i)] = A[L - (j - i), L] $

于是我们可以得出

[G(x) * (frac 1 m) ^ L = sum_{A[1, i] = A[L - i, L]} F(x) * ( frac 1 m) ^ {(L - i)} ]

统计一下我们现在有两个式子

[egin{cases} F(x) + G(x) = 1 + G(x) * x \ G(x) * (frac 1 m) ^ L = sumlimits_{A[1, i] = A[L - i, L]} F(x) * ( frac 1 m) ^ {(L - i)} end{cases} ]

对一式求导

[F'(x) + G'(x) = G'(x) * x + G(x) ]

(x = 1)

[F'(1) + G'(1) = G'(1) + G(1) ]

[F'(1) = G(1) = E ]

我们现在想知道 (G(1)),把 (x = 1) 带入二式得

[G(1) * (frac 1 m) ^ L = sum_{A[1, i] = A[L - i, L]} F(1) * ( frac 1 m) ^ {(L - i)} ]

[G(1) = sum_{A[1, i] = A[L - i, L]} F(1) * m ^ i ]

(F(1) = sum p_i = 1)

所以

[E = G(1) = sum_{A[1, i] = A[L - i, L]} m ^ i ]

这个东西可以用 KMP 暴力 O(L) 跳边计算

于是这道题就解决了,时间复杂度 (O(t * L))

(code)

#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
int nxt[N], s[N], pw[N], n, m, t;
const int mod = 10000;
#define rg register
inline int read(){
	rg char ch = getchar();
	rg int x = 0, f = 0;
	while(! isdigit(ch)) f |= (ch == '-'), ch = getchar();
	while(isdigit(ch)) x = (x << 1) + (x << 3) + (ch ^ 48), ch = getchar();
	return f ? -x : x;
}
int main(){
	n = read(), t = read();
	pw[0] = 1;
	for(int i = 1; i < N; ++i) pw[i] = pw[i - 1] * n % mod;
	while(t--){
		m = read();
		for(int i = 1; i <= m; ++i) s[i] = read();
		for(int j = 0, i = 2; i <= m; ++i){
			while(j && s[j + 1] ^ s[i]) j = nxt[j];
			j += (s[j + 1] == s[i]);
			nxt[i] = j;
		}
		int ans = 0;
		for(int i = m; i; i = nxt[i]){
			(ans += pw[i]);
			if(ans >= mod) ans -= mod;
		}
		printf("%04d
", ans);
	}
	return 0;
}
END?

免责声明:文章转载自《概率生成函数》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Spring boot 整合Activiti中遇到的问题Selenium 2自动化测试实战7(定位元素)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

gdb调试命令的使用及总结

gdb调试命令的使用及总结 gdb是一个在UNIX环境下的命令行调试工具。如果需要使用gdb调试程序,请在gcc时加上-g选项。下面的命令部分是简化版,比如使用l代替list等等。 1.基本命令 命令 描述 backtrace(或bt) 查看各级函数调用及参数 finish 连续运行到当前函数返回为止,然后停下来等待命令 fram...

深入理解xLua基于IL代码注入的热更新原理

目前大部分手游都会采用热更新来解决应用商店审核周期长,无法满足快节奏迭代的问题。另外热更新能够有效降低版本升级所需的资源大小,节省玩家的时间和流量,这也使其成为移动游戏的主流更新方式之一。 热更新可以分为资源热更和代码热更两类,其中代码热更又包括Lua热更和C#热更。Lua作为一种轻量小巧的脚本语言,由Lua虚拟机解释执行。所以Lua热更通过简单的源代码文...

查看SqlServer的内存使用情况

      上一篇提到动态T-SQL会产生较多的执行计划,这些执行计划会占用多少内存呢?今天从徐海蔚的书中找到了答案。动态视图不仅可以查到执行计划的缓存,数据表的页面缓存也可以查到,将SQL整理一下,做个标记。 -- 查询SqlServer总体的内存使用情况 select type , sum(virtual_memory_re...

指数型生成函数学习笔记

指数型生成函数学习笔记 指数型生成函数 用于解决排列计数问题, 其生成函数形式如下: [g^{(e)}(x)=1+x+frac{x^2}{2!}+frac{x^3}{3!}+frac{x^4}{4!}+... ] 因为全排列出来有重复元素,对于重复了k次的a元素,在n个数中的排列方法为(frac{n!}{k!}),然后有 [frac{x^{m_{1}+m_...

机器学习 —— 概率图模型(推理:团树算法)

  在之前的消息传递算法中,谈到了聚类图模型的一些性质。其中就有消息不能形成闭环,否则会导致“假消息传到最后我自己都信了”。为了解决这种问题,引入了一种称为团树(clique tree)的数据结构,树模型没有图模型中的环,所以此模型要比图模型更健壮,更容易收敛。 1.团树模型   链模型是一种最简单的树模型,其结构如下图所示,假设信息从最左端传入则有以下式...

SQL中AVG、COUNT、SUM、MAX等聚合函数对NULL值的处理

一、AVG()求平均值注意AVE()忽略NULL值,而不是将其作为“0”参与计算  二、COUNT() 两种用法 1、COUNT(*)对表中行数进行计数不管是否有NULL 2、COUNT(字段名)对特定列有数据的行进行计数忽略NULL值  三、MAX()、MIN()求最大、最小值都忽略NULL  四、SUM()可以对单个列求和,也可以对多个列运算后求和忽略...