[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$表 ...
随机推荐
- GPU硬件加速
现代浏览器大都可以利用GPU来加速页面渲染.每个人都痴迷于60桢每秒的顺滑动画.在GPU的众多特性之中,它可以存储一定数量的纹理(一个矩形的像素点集合)并且高效地操作这些纹理(比如进行特定的移动.缩放 ...
- ImportError: libQtTest.so.4: cannot open shared
错误: import cv2 File , in <module> from .cv2 import * ImportError: libQtTest.so.: cannot open s ...
- Linux内核基础--事件通知链(notifier chain)【转】
转自:http://blog.csdn.net/wuhzossibility/article/details/8079025 内核通知链 1.1. 概述 Linux内核中各个子系统相互依赖,当其中某个 ...
- Sql Server 2014/2012/2008/2005 数据库还原出现 3154错误的解决办法
在Sql Server 数据库还原出现 3154错误 解决方法1:不要在数据库名字上点右键选择还原,而要是在根目录“数据库”三个字上点右键选择还原,然后再选择数据库,问题便可以解决,如果不行参照方法 ...
- 算法题之找出数组里第K大的数
问题:找出一个数组里面前K个最大数. 解法一(直接解法): 对数组用快速排序,然后直接挑出第k大的数.这种方法的时间复杂度是O(Nlog(N)).N为原数组长度. 这个解法含有很多冗余,因为把整个数组 ...
- mac cocoapod安装过程
cocoapod: 自动化管理第三方开发包的一个插件, 废话不多说, 一个新手只需做如下几个步骤 1-> 安装ruby环境(可忽略, 不是必要) 1.1 首先我们先看看当前你机器上ruby的版本 ...
- Oracle事务处理
原文转自:(http://www.cnblogs.com/ITtangtang/archive/2012/04/23/2466554.html) 一.事务概念事务用于保证数据的一致性,它由一组相关的d ...
- SQL中判断值是否为NULL
在 SQL 中,我们如果在操作数据库时使用 WHERE 子句判断一个列的值是否为 NULL,我们不能够使用 column_name=null 来进行判断,这是不正确的,我们应该使用 is null 来 ...
- MYSQL有外键无法删除
今天删除数据库中数据,提示因为设置了foreign key,无法修改删除 可以通过设置FOREIGN_KEY_CHECKS变量来避免这种情况. SET FOREIGN_KEY_CHECKS=0; 删除 ...
- selenium+python自动化78-autoit参数化与批量上传【转载】
转至博客:上海-悠悠 前言前一篇autoit实现文件上传打包成.exe可执行文件后,每次只能传固定的那个图片,我们实际测试时候希望传不同的图片.这样每次调用的时候,在命令行里面加一个文件路径的参数就行 ...