首页 > 代码库 > 【HDU 6021】 MG loves string (枚举+容斥原理)

【HDU 6021】 MG loves string (枚举+容斥原理)

MG loves string

 Accepts: 30
 Submissions: 67
 Time Limit: 2000/1000 MS (Java/Others)
 Memory Limit: 262144/262144 K (Java/Others)
问题描述
MGMG是一个很忙碌的男孩子。今天他沉迷于这样一个问题:

对于一个长度为NN的由小写英文字母构成的随机字符串,当它进行一次变换,所有字符ii都会变成a[i]a[i]。

MGMG规定所有a[i]a[i]构成了2626个字母组成的排列。

MGMG现在需要知道这个随机串变换到自身的期望变换次数。请你输出期望答案乘上26^n26?n??以后模 10000000071000000007 的结果。

MGMG认为这件事非常容易,不屑于用计算机解决,于是运用他高超的人类智慧开始进行计算。作为一名旁观者,你也想挑战MGMG智慧,请你写个程序,计算答案。
输入描述
第一行一个整数TT,代表数据组数(1 <=T<=101<=T<=10)。

接下来,对于每组数据——

第一行一个整数NN,表示给定的随机串长度(1<=N<=10000000001<=N<=1000000000)。

第二行2626个字母,表示a_ia?i??序列
输出描述
对于每一组数据,输出一行。

显然,这个期望是一个实数。请你输出它乘上26^N26?N??以后模 10000000071000000007 的结果
输入样例
2
2
abcdefghijklmnpqrstuvwxyzo
1
abcdefghijklmnopqrstuvwxyz
输出样例
5956
26


 

【分析】

  感觉BC的题挺好的啊【每次都能学到东西。。

  首先,知道,这是个带LCM的期望。就是看随机串分别在长度为几的循环节里面,然后LCM。

  然后,不同长度的循环节不会超过6个,1+2+3+4+5+6=21。

  就是根据输入的那个串,只会有6种长度的循环节,所以你可以枚举真正的随机串涵盖的循环节有哪几个,枚举是2^6。

  然后就是把n个字符放到那些循环节的字母集合中去,但是要保证每个循环节都一定有一个字母覆盖,问它的方案数。

  其实这是经典的容斥原理,就是n个东西分到m个集合,让每个集合都至少有一个东西。

  这里我们枚举子集就可以用容斥原理计算出来了【注意容斥,你要减掉的是没有涵盖某一个集合的,加上没有涵盖两个集合的。。。】

  枚举子集是3^n(用二项式定理易证)

  这个可以预处理的。

  所以是$O(2^6*\log(n)+3^6)$

 

官方题解:

技术分享

 

2017-04-02 10:41:18

 

【HDU 6021】 MG loves string (枚举+容斥原理)