$\newcommand{\align}[1]{\begin{align*}#1\end{align*}}$题意:对于一个字符串$s$,定义$C(s)$为$s$中(出现次数最多的字母)出现的次数,问长度为$n$,字符集大小为$m$且$C(s)=k$的字符串有多少个

设$f_{i,j,k}$表示字符集大小为$i$,长度为$j$且$C(s)\leq k$的方案数,那么有$\align{f_{i,j,k}=\sum\limits_{l=0}^k\binom jlf_{i-1,j-l,k}}$(枚举最大字符的出现次数$l$,这个字符在$s$中出现的不同方案为$\align{\binom jl}$,剩下字符组成字符串的方案数为$f_{i-1,j-l,k}$)

这个DP式的第三维下标$k$没有变化,不妨删掉这维,并稍微推导一下:

$\align{f_{i,j}&=\sum\limits_{j=0}^k\binom jlf_{i-1,j-l}\\\dfrac{f_{i,j}}{j!}&=\sum\limits_{j=0}^k\dfrac1{l!}\dfrac{f_{i-1,j-l}}{(j-l)!}}$

这是卷积的形式,记$\align{F_i(x)=\sum\limits_{j=0}^k\dfrac{f_{i,j}x^j}{j!}}$,则$\align{F_i(x)=F_{i-1}(x)\left(\sum\limits_{j=0}^k\dfrac1{j!}\right)}$,直接快速幂就可以了,于是$\align{f_{i,j,k}=n!\left[x^n\right]\left(\sum\limits_{j=0}^k\dfrac1{j!}\right)^m}$,答案为$f_{i,j,k}-f_{i,j,k-1}$

#include<stdio.h>
#include<string.h>
const int mod=998244353;
typedef long long ll;
int mul(int a,int b){return a*(ll)b%mod;}
int ad(int a,int b){return(a+b)%mod;}
int de(int a,int b){return(a-b)%mod;}
int pow(int a,int b){
	int s=1;
	while(b){
		if(b&1)s=mul(s,a);
		a=mul(a,a);
		b>>=1;
	}
	return s;
}
int rev[131072],N,iN;
void pre(int n){
	int i,k;
	for(N=1,k=0;N<n;N<<=1)k++;
	for(i=0;i<N;i++)rev[i]=(rev[i>>1]>>1)|((i&1)<<(k-1));
	iN=pow(N,mod-2);
}
void swap(int&a,int&b){a^=b^=a^=b;}
void ntt(int*a,int on){
	int i,j,k,t,w,wn;
	for(i=0;i<N;i++){
		if(i<rev[i])swap(a[i],a[rev[i]]);
	}
	for(i=2;i<=N;i<<=1){
		wn=pow(3,(on==1)?(mod-1)/i:(mod-1-(mod-1)/i));
		for(j=0;j<N;j+=i){
			w=1;
			for(k=0;k<i>>1;k++){
				t=mul(w,a[i/2+j+k]);
				a[i/2+j+k]=de(a[j+k],t);
				a[j+k]=ad(a[j+k],t);
				w=mul(w,wn);
			}
		}
	}
	if(on==-1){
		for(i=0;i<N;i++)a[i]=mul(a[i],iN);
	}
}
void pow(int*a,int n,int k,int*s){
	int i;
	s[0]=1;
	pre((n+1)<<1|1);
	while(k){
		ntt(a,1);
		if(k&1){
			ntt(s,1);
			for(i=0;i<N;i++)s[i]=mul(s[i],a[i]);
			ntt(s,-1);
			for(i=n+1;i<N;i++)s[i]=0;
		}
		for(i=0;i<N;i++)a[i]=mul(a[i],a[i]);
		ntt(a,-1);
		for(i=n+1;i<N;i++)a[i]=0;
		k>>=1;
	}
}
int fac[50010],rfac[50010],a[131072],b[131072];
int solve(int n,int m,int k){
	int i;
	memset(a,0,sizeof(a));
	memset(b,0,sizeof(b));
	for(i=0;i<=k;i++)a[i]=rfac[i];
	pow(a,n,m,b);
	return mul(b[n],fac[n]);
}
int main(){
	int n,m,k,i;
	scanf("%d%d%d",&n,&m,&k);
	fac[0]=1;
	for(i=1;i<=n;i++)fac[i]=mul(fac[i-1],i);
	rfac[n]=pow(fac[n],mod-2);
	for(i=n;i>0;i--)rfac[i-1]=mul(rfac[i],i);
	printf("%d",(de(solve(n,m,k),solve(n,m,k-1))+mod)%mod);
}

[xsy2579]counting的更多相关文章

  1. 萌新笔记——Cardinality Estimation算法学习(二)(Linear Counting算法、最大似然估计(MLE))

    在上篇,我了解了基数的基本概念,现在进入Linear Counting算法的学习. 理解颇浅,还请大神指点! http://blog.codinglabs.org/articles/algorithm ...

  2. POJ_2386 Lake Counting (dfs 错了一个负号找了一上午)

    来之不易的2017第一发ac http://poj.org/problem?id=2386 Lake Counting Time Limit: 1000MS   Memory Limit: 65536 ...

  3. ZOJ3944 People Counting ZOJ3939 The Lucky Week (模拟)

    ZOJ3944 People Counting ZOJ3939 The Lucky Week 1.PeopleConting 题意:照片上有很多个人,用矩阵里的字符表示.一个人如下: .O. /|\ ...

  4. find out the neighbouring max D_value by counting sort in stack

    #include <stdio.h> #include <malloc.h> #define MAX_STACK 10 ; // define the node of stac ...

  5. 1004. Counting Leaves (30)

    1004. Counting Leaves (30)   A family hierarchy is usually presented by a pedigree tree. Your job is ...

  6. 6.Counting Point Mutations

    Problem Figure 2. The Hamming distance between these two strings is 7. Mismatched symbols are colore ...

  7. 1.Counting DNA Nucleotides

    Problem A string is simply an ordered collection of symbols selected from some alphabet and formed i ...

  8. uva 11401 Triangle Counting

    // uva 11401 Triangle Counting // // 题目大意: // // 求n范围内,任意选三个不同的数,能组成三角形的个数 // // 解题方法: // // 我们设三角巷的 ...

  9. JSONKit does not support Objective-C Automatic Reference Counting(ARC) / ARC forbids Objective-C objects in struct

    当我们在使用JSONKit处理数据时,直接将文件拉进项目往往会报这两个错“JSONKit   does not support Objective-C Automatic Reference Coun ...

随机推荐

  1. ssh.sh_for_ubuntu1404

    #!/bin/bash sed -i 's/PermitRootLogin without-password/PermitRootLogin yes/g' /etc/ssh/sshd_config s ...

  2. [转载]有关如何入门ACM

    来源: 吴垠的日志 一些题外话 首先就是我为什么要写这么一篇日志.原因很简单,就是因为前几天有个想起步做ACM人很诚恳的问我该如何入门.其实就现在而言,我并不是很想和人再去讨论这样的话题,特别是当我发 ...

  3. 更换checkbox的原有样式

    通常情况下,各个浏览器对的样式不一致,并且不那么美观.所以有时候设计需要我们更换原有的样式: html: <span><input type="checkbox" ...

  4. 基于HTTP协议的轻量级开源简单队列服务:HTTPSQS[转]

    HTTPSQS(HTTP Simple Queue Service)是一款基于 HTTP GET/POST 协议的轻量级开源简单消息队列服务,使用 Tokyo Cabinet 的 B+Tree Key ...

  5. java实现远程开机

    import java.io.IOException; import java.net.*;public class 远程开机 { public static void main(String[] a ...

  6. 再探 KMP 算法

    $\DeclareMathOperator{\fail}{fail}$ KMP 算法堪称经典中的经典,然而这么多年以来,我却未能完全理解这个算法.我对 KMP 算法掌握的程度,是知其原理,但写不出来. ...

  7. [洛谷P4889]kls与flag

    题目大意:有$n$根竹竿,第$i$根竹竿在$i$位置,第​$i$根竹竿高度为​$h_i$,每根竹竿可以向左倒或向右倒,问有几对竹竿倒下后顶端重合. 题解:求出每根竹竿倒下后的位置,离散化,记录一下每个 ...

  8. 决策树与随机森林Adaboost算法

    一. 决策树 决策树(Decision Tree)及其变种是另一类将输入空间分成不同的区域,每个区域有独立参数的算法.决策树分类算法是一种基于实例的归纳学习方法,它能从给定的无序的训练样本中,提炼出树 ...

  9. [poj] 3041 Asteroids || 最小点覆盖=最大二分图匹配

    原题 本题为最小点覆盖,而最小点覆盖=最大二分图匹配 //最小点覆盖:用最少的点(左右两边集合的点)让每条边都至少和其中一个点关联. #include<cstdio> #include&l ...

  10. 洛谷 P1136 迎接仪式 解题报告

    P1136 迎接仪式 题目描述 LHX教主要来X市指导OI学习工作了.为了迎接教主,在一条道路旁,一群Orz教主er穿着文化衫站在道路两旁迎接教主,每件文化衫上都印着大字.一旁的Orzer依次摆出&q ...