题意:求$n$个数的所有排列形成的轮换个数的$m$次方之和

我以前只知道这是GDKOI的题,今天在ckw博客上发现它是TC题...原题真是哪里都有...

就是求$\sum\limits_{i=1}^n{n\brack i}i^m$

一个引理${n+1\brack m+1}=\sum\limits_k{n\brack k}\binom km$,可以直接用生成函数暴力证

$\begin{aligned}{n+1\brack m+1}=(n+1)![z^{n+1}]\frac{\ln^{m+1}\left(\frac1{1-z}\right)}{(m+1)!}=\frac{n!}{m!}[z^n]\frac1{1-z}\ln^m\left(\frac1{1-z}\right)\end{aligned}$

$\begin{aligned}\sum\limits_k{n\brack k}\binom km&=n![z^n]\sum\limits_k\frac{\ln^k\left(\frac1{1-z}\right)}{k!}\binom km\\&=\frac{n!}{m!}[z^n]\sum\limits_k\frac{\ln^k\left(\frac1{1-z}\right)}{(k-m)!}\\&=\frac{n!}{m!}[z^n]\ln^m\left(\frac1{1-z}\right)\frac1{1-z}\end{aligned}$

然后推式子

$\begin{aligned}\sum\limits_{i=1}^n{n\brack i}i^m&=\sum\limits_{i=1}^n{n\brack i}\sum\limits_{j=1}^m{m\brace j}i^{\underline j}\\&=\sum\limits_{j=1}^m{m\brace j}j!\sum\limits_{i=1}^n{n\brack i}\binom ij\\&=\sum\limits_{j=1}^mj!{m\brace j}{n+1\brack j+1}\end{aligned}$

$O(nm)$预处理第一类斯特林数,$O(m^2)$预处理第二类斯特林数,就可以$O(m)$回答一个询问了

#include<stdio.h>
#include<vector>
using namespace std;
typedef long long ll;
const int mod=1000000007;
int mul(int a,int b){return a*(ll)b%mod;}
int s1[100010][310],s2[310][310],fac[100010];
void pre(int n,int k){
	int i,j;
	fac[0]=1;
	for(i=1;i<=n;i++)fac[i]=mul(fac[i-1],i);
	s1[0][0]=1;
	for(i=1;i<=n+1;i++){
		for(j=1;j<=k+1&&j<=i;j++)s1[i][j]=(mul(s1[i-1][j],i-1)+s1[i-1][j-1])%mod;
	}
	s2[0][0]=1;
	for(i=1;i<=k;i++){
		for(j=1;j<=i;j++)s2[i][j]=(mul(s2[i-1][j],j)+s2[i-1][j-1])%mod;
	}
}
int solve(int n,int k){
	if(k==0)return fac[n];
	int j,f,s;
	f=1;
	s=0;
	for(j=1;j<=k;j++){
		f=mul(f,j);
		(s+=mul(f,mul(s2[k][j],s1[n+1][j+1])))%=mod;
	}
	return s;
}
class CyclesNumber{
	public:
		vector<int>getExpectation(vector<int>n,vector<int>m){
			pre(100000,300);
			vector<int>res;
			for(int i=0;i<(int)n.size();i++)res.push_back(solve(n[i],m[i]));
			return res;
		}
};
/*
int main(){
	vector<int>a,b;
	CyclesNumber c;
	int n,m;
	scanf("%d%d",&n,&m);
	a.push_back(n);
	b.push_back(m);
	printf("%d",*c.getExpectation(a,b).begin());
}
*/

[SRM686]CyclesNumber的更多相关文章

  1. topcoder srm 686 div1

    problem1 link 左括号和右括号较少的一种不会大于20.假设左括号少.设$f[i][mask][k]$表示处理了前$i$个字符,其中留下的字符以$k$开头($k=0$表示'(',$k=1$表 ...

随机推荐

  1. CSS3 动画实现方法大全

    常用效果总结(需要引用animate.css) <!doctype html> <html lang="en"> <head> <meta ...

  2. fork与printf缓冲问题

    printf输出条件: (1) 调用fflush: (2) 缓冲区满了: (3) 遇到\n \r这些字符 (4) 遇到scanf这些要取缓冲区的: (5) 线程或者进程退出: fork之后会拷贝父进程 ...

  3. rdpClient

    https://github.com/jean343/RPI-GPU-rdpClient https://github.com/Nullstr1ng/MultiRDPClient.NET https: ...

  4. Linux配置Tomcat

    系统:Ubuntu,Tomcat:apache-tomcat-8.5.23.tar.gz 1,找到apache-tomcat-8.5.23.tar.gz,复制到 /usr/local root@ubu ...

  5. HTML+CSS+JS(+Vue)写一个通讯录组件

    求各位大大的Star(*/ω\*). 没有录屏,所以上传的是图片.后面已补充录屏效果. 效果:(主要是参考小米Note3的通讯录的效果做的) 主要功能: 1. 滚动后,通讯录的模块标题会固定在顶部(图 ...

  6. JavaScript 正则表达式的入门与使用

    知道正则表达式已经很久了,粗略会看懂一些,不过以前没有系统的学习,最近在看<JS权威指南>,刚好看到了看到正则表达式部分,就比较系统的学习了正则表达式. 先说一下正则表达式的一些基本知识 ...

  7. 在一个Ubuntu系统上配置Apache支持多个站点

    查看原文请访问:http://codewenda.com/ubuntu16-04%E9%85%8D%E7%BD%AEapache%E6%94%AF%E6%8C%81%E5%A4%9A%E4%B8%AA ...

  8. Fel表达式使用过程中需要注意的问题

    精度问题: 我们知道java中直接使用float和double参与的计算都可能会产生精度问题,比如0.1+0.3.1.0-0.9 等.所以一般财务系统,都会使用BigDecimal进行加减乘除. 在调 ...

  9. python基础(2)---数据类型

    1.python版本间的差异: 2.x与3.x版本对比 version 2.x 3.x print print " "或者print()打印都可以正常输出 只能print()这种形 ...

  10. LeetCode解题报告—— Interleaving String

    Given s1, s2, s3, find whether s3 is formed by the interleaving of s1 and s2. Example 1: Input: s1 = ...