$\newcommand{stirf}[2]{{{#1}\brack{#2}}}$$\newcommand{stirs}[2]{{{#1}\brace{#2}}}$题意:$\sum\limits_{i=1}^mx_i\leq s$,对$\forall1\leq i\leq n,x_i\leq t$,求这个方程组的解数

做了几天总算是弄明白了...

会用到$\sum\limits_{k\leq n}\binom km=\binom{n+1}{m+1}$,这个直接归纳可证

方程$\sum\limits_{i=1}^nx_i=s,x_i\geq1$的解数是$\binom{s-1}{n-1}$,所以$\sum\limits_{i=1}^nx_i\leq s,x_i\geq1$的解数是$\binom sn$

枚举$x_{1\cdots n}$,答案即为$\sum\limits_{1\leq x_1\leq t}\cdots\sum\limits_{1\leq x_n\leq t}\binom{s-\sum\limits_{i=1}^n x_i}{m-n}$

如果去掉$\leq t$的限制,那么答案显然是$\binom sm$

所以对原问题考虑容斥,枚举至少有$k$个$x_i$不满足$x_i\leq t$的限制,将这些$x_i$减去$t$后就将限制变成了$1\leq x_i$,那么答案为$\sum\limits_{k=0}^n(-1)^k\binom nk\binom{s-kt}m$

接下来是构造,对于一个函数$f(x)$,对其$n$阶差分的结果为$\Delta^nf(x)=\sum\limits_{k=0}^n(-1)^{n+k}\binom nkf(x+k)$,令$f(x)=\binom{s-xt}m$,那么答案为$(-1)^n\Delta^nf(0)$

$f(x)$是一个$m$次多项式,写出它的牛顿级数$\sum\limits_{i=0}^mb_i\binom xi$并将其代入差分式中

$\begin{aligned}\Delta^nf(0)&=\sum\limits_{k=0}^n(-1)^{n+k}\binom nkf(k)\\&=\sum\limits_{k=0}^n(-1)^{n+k}\binom nk\sum\limits_{i=0}^mb_i\binom ki\\&=\sum\limits_{i=0}^mb_i\sum\limits_{k=0}^n(-1)^{n+k}\binom nk\binom ki\\&=\sum\limits_{i=0}^mb_i\binom ni(-1)^{n-i}\sum\limits_{k=0}^n(-1)^{k-i}\binom{n-i}{k-i}\\&=\sum\limits_{i=0}^mb_i\binom ni(-1)^{n-i}[n=i]\\&=b_n\end{aligned}$

所以我们只需求$b_n$,但为了求$b_n$,我们要先求$f(x)=\sum\limits_{i=0}^ma_ix^i$中的$a_i$,直接把下降幂展开成斯特林数即可,我们得到$a_i=\frac1{m!}\sum\limits_{j=i}^m(-1)^{m+i+j}\binom ji\stirf mjt^is^{j-i}$

$\begin{aligned}f(x)&=\sum\limits_{i=0}^ma_ix^i\\&=\sum\limits_{i=0}^ma_i\sum\limits_{j=0}^i\stirs ijx^{\underline j}\\&=\sum\limits_{j=0}^m\binom xj\sum\limits_{i=j}^ma_i\stirs ijj!\end{aligned}$

于是$b_n=\frac{n!(-1)^mt^n}{m!}\sum\limits_{i=0}^{m-n}\sum\limits_{j=0}^{m-n-i}(-1)^j\binom{n+i+j}j\stirs{n+i}n\stirf m{n+i+j}t^is^j$

差不多结束了,最后有一个小问题:求斯特林数

要求$\stirs nm$,虽然$n,m$都非常大,但$n-m$非常小,考虑$\stirs nm$的组合意义:将$n$个元素分为$m$个非空子集,因为最多有$n-m$个子集中的元素个数$\gt1$,设$g(n,m)$表示将$n$个元素分成$m$个子集,使得每个子集包含元素个数都$\gt1$的方案数,那么枚举$m$个子集中元素个数$\gt1$的子集个数$k$(剩下$m-k$个集合都只包含一个元素),我们得到$\stirs nm=\sum\limits_{k=0}^{n-m}\binom n{m-k}g(n-m+k,k)$

$g$的递推就和第二类斯特林数差不多了:$g(n,m)=m\cdot g(n-1,m)+(n-1)g(n-2,m-1)$

第一类也是类似的,只不过$g$的递推要相应地改成$g(n,m)=(n-1)g(n-1,m)+(n-1)g(n-2,m-1)$

于是我们可以$O\left((m-n)^2\right)$预处理并$O(m-n)$计算单个斯特林数,总的时间复杂度就是$O\left((m-n)^2\right)$了

数学真是一门化腐朽为神奇的学科==

#include<stdio.h>
typedef long long ll;
const int mod=1000000007;
int mul(int a,int b){return(ll)a*b%mod;}
int ad(int a,int b){return(a+b)%mod;}
void inc(int&a,int b){(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 g1[210][210],g2[210][210],fac[210],rfac[210],inv[210];
void pre(int n){
	int i,j;
	g1[0][0]=g2[0][0]=1;
	for(i=1;i<=n;i++){
		for(j=1;j*2<=i;j++){
			g1[i][j]=mul(i-1,g1[i-1][j]);
			g2[i][j]=mul(j,g2[i-1][j]);
			if(i>1){
				inc(g1[i][j],mul(i-1,g1[i-2][j-1]));
				inc(g2[i][j],mul(i-1,g2[i-2][j-1]));
			}
		}
	}
	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);
	inv[1]=1;
	for(i=2;i<=n;i++)inv[i]=-mul(mod/i,inv[mod%i]);
}
int binom(int n,int k){//k is small
	int i,s=1;
	for(i=0;i<k;i++)s=mul(s,n-i);
	return mul(s,rfac[k]);
}
int stirf(int n,int m){
	int i,t,s,b;
	s=0;
	b=binom(n,n-m);
	for(i=0;i<=n-m;i++){
		t=n-m+i;
		inc(s,mul(b,g1[t][i]));
		b=mul(b,mul(n-t,inv[t+1]));
	}
	return s;
}
int stirs(int n,int m){
	int i,t,s,b;
	s=0;
	b=binom(n,n-m);
	for(i=0;i<=n-m;i++){
		t=n-m+i;
		inc(s,mul(b,g2[t][i]));
		b=mul(b,mul(n-t,inv[t+1]));
	}
	return s;
}
int a[110],b[110];
class TrickyInequality{
	public:
		int countSolutions(ll s,int t,int n,int m){
			int i,j,res,pt,ps,bi;
			s%=mod;
			pre(200);
			for(i=0;i<=m-n;i++){
				a[i]=stirf(m,n+i);
				b[i]=stirs(n+i,n);
			}
			res=0;
			pt=1;
			for(i=0;i<=m-n;i++){
				ps=1;
				bi=1;
				for(j=0;j<=m-n-i;j++){
					inc(res,(j&1?-1:1)*mul(mul(mul(bi,b[i]),a[i+j]),mul(pt,ps)));
					ps=mul(ps,s);
					bi=mul(bi,mul(n+i+j+1,inv[j+1]));
				}
				pt=mul(pt,t);
			}
			res=mul(res,pow(t,n));
			for(i=n+1;i<=m;i++)res=mul(res,pow(i,mod-2));
			if((n+m)&1)res=-res;
			return(res+mod)%mod;
		}
};
/*
int main(){
	ll s;
	int t,n,m;
	TrickyInequality cl;
	scanf("%I64d%d%d%d",&s,&t,&n,&m);
	printf("%d",cl.countSolutions(s,t,n,m));
}
*/

[TCO2013]TrickyInequality的更多相关文章

  1. @topcoder - 2013TCO3A D1L3@ TrickyInequality

    目录 @description@ @accepted code@ @accepted code@ @details@ @description@ 现有不等式组: \[\begin{cases} x_1 ...

  2. [TCO2013]Block3Checkers

    题意:一个网格上有一些障碍和$3$个在网格边界上的棋子,你要添加一些障碍使得没有两个棋子四连通,问最少添加多少个障碍 官方题解——一张图教你做人... 三个棋子将网格边界分成三段,添加障碍后网格中一定 ...

  3. [TCO2013]LitPanels

    题意:一个$n\times m$的无色网格,你可以在其中选择两个$x\times y$的子矩形并在其中将其中任意的格子涂上颜色,问最终能得到多少种不同的网格 做这题会用到一个概念叫包围盒(boundi ...

  4. [TCO2013]DirectionBoard

    题意:给一个网格,每个格子有一个方向表示在这个格子上要往哪个方向走,你可以改变某些格子的方向,问最少多少次操作使得从任意格子出发都能回到这个格子 woc这都不会我还是回家种田去吧... 题目的要求是改 ...

随机推荐

  1. pythonTensorFlow实现yolov3训练自己的目标检测探测自定义数据集

    1.数据集准备,使用label标注好自己的数据集. https://github.com/tzutalin/labelImg 打开连接直接下载数据标注工具, 2.具体的大师代码见下链接 https:/ ...

  2. 关于 zfs 命令相关介绍

    三种设备:filesystem  volume  snapshot 1.zfs listroot@UA4300D-spa:~/hanhuakai/pro_07/git_0708# zfs listNA ...

  3. Python第三方库jieba(中文分词)入门与进阶(官方文档)

    jieba "结巴"中文分词:做最好的 Python 中文分词组件 github:https://github.com/fxsjy/jieba 特点 支持三种分词模式: 精确模式, ...

  4. JSP九大内置对象,七大动作,三大指令

    JSP之九大内置对象 隐藏对象入门探索 Servlet 和JSP中输出数据都需要使用out对象.Servlet 中的out对象是通过getWriter()方法获取的.而JSP中没有定义out对象却可以 ...

  5. 数据结构--Avl树的创建,插入的递归版本和非递归版本,删除等操作

    AVL树本质上还是一棵二叉搜索树,它的特点是: 1.本身首先是一棵二叉搜索树.   2.带有平衡条件:每个结点的左右子树的高度之差的绝对值最多为1(空树的高度为-1).   也就是说,AVL树,本质上 ...

  6. [Leetcode Week17]Copy List with Random Pointer

    Copy List with Random Pointer 题解 原创文章,拒绝转载 题目来源:https://leetcode.com/problems/copy-list-with-random- ...

  7. java===java基础学习(9)---方法参数

    方法参数注意三要点: 一个方法不能修改一个基本数据类型的参数(数值型或者布尔型). 一个方法可以改变一个对象参数的状态. 一个方法不能让对象参数引用一个新的对象. package testbotoo; ...

  8. 包装类、基本数据类型及String类之间的相互转换

    包装类:8种基本数据类型对应一个类,此类即为包装类 一.基本数据类型 包装类 及String之间的转换 1.基本数据类型转化为包装类:调用包装类的构造器      int i=10;     Inte ...

  9. PHP-5.6.22安装

    查看系统及内核版本 [root@test88 ~]# cat /etc/redhat-release CentOS release 6.6 (Final) [root@test88 ~]# uname ...

  10. CF1064 E - Dwarves, Hats and Extrasensory Abilities

    题意 交互题, 本来应该是在平面上进行的. 实际上换成一条直线就可以, 其实换成在平面上更复杂一些. Solution 假设\(l\)点是黑点, \(r\)处是白点, 那么就把下一个点的位置放置在\( ...