[SRM686]CyclesNumber
题意:求$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的更多相关文章
- topcoder srm 686 div1
problem1 link 左括号和右括号较少的一种不会大于20.假设左括号少.设$f[i][mask][k]$表示处理了前$i$个字符,其中留下的字符以$k$开头($k=0$表示'(',$k=1$表 ...
随机推荐
- Spring mvc详解(山东数漫江湖)
Spring mvc框架 Spring web MVC 框架提供了模型-视图-控制的体系结构和可以用来开发灵活.松散耦合的 web 应用程序的组件.MVC 模式导致了应用程序的不同方面(输入逻辑.业务 ...
- 4 Values whose Sum is 0 POJ 2785 (折半枚举)
题目链接 Description The SUM problem can be formulated as follows: given four lists A, B, C, D of intege ...
- bzoj 1188 SG函数
首先我们可以把一个石子看成一个单独的游戏,那么我们可以发现所有位置的石子至于奇偶有关,因为某一个人操作其中的一个石子,我们可以用相同的石子做相同的操作,所以我们只需要保留下所有位置的01,那么对于每个 ...
- vue基本介绍
https://cn.vuejs.org/v2/guide/ Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式框架.与其它大型框架不同的是,Vue 被设计为可以自底向上 ...
- Jmeter===Jmeter中使用CSV Data Set Config参数化不重复数据执行N遍(转)
Jmeter中使用CSV Data Set Config参数化不重复数据执行N遍 要求: 今天要测试上千条数据,且每条数据要求执行多次,(模拟多用户多次抽奖) 1.用户id有175个,且没有任何排序规 ...
- 如何更新远程主机上的 Linux 内核
如何更新远程主机上的 Linux 内核 http://blog.csdn.net/robertsong2004/article/details/47277121 转载至:http://www.tiny ...
- OpenRCT2-ext
https://github.com/RollingStar/RCT-Music-Patch https://github.com/seanfisk/rct2-game-objects https:/ ...
- STL不同容器的使用方法
以下内容摘自:http://blog.csdn.net/u014465639/article/details/70241850 1.vector(需要导入头文件#include <vector& ...
- 访问WEB-INF目录中的文件
WEB-INF下面的文件具有安全性,直接在浏览器中输入地址是访问不到的,可以通过servlet来访问. 方法1: 利用<jsp-file>/WEB-INF/a.jsp</jsp-fi ...
- [LabVIEW架构]ActorFramework(二)
前言 在上一个文章中,我们介绍了一下LabVIEW中AF的基本概念,本讲将以上一次的例子来讲解LabVIEW中的实现 正文 范例说明 假定两个人,一个作为老师,一个作为学生.学生每天早上给老师发送一封 ...