$\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 smallint 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));
}
*/

转载于:https://www.cnblogs.com/jefflyy/p/9762837.html

[TCO2013]TrickyInequality相关推荐

  1. 【TCO2013 Semifinal 2】 OneBlack

    Description 一个  的网格图,一些格子有障碍.一条合法路径的定义是从  到 的,一共走  步的路径. 你要把一些格子染黑,使得每一条合法路径上恰好有一个黑点.问合法方案数. Difficu ...

最新文章

  1. java程序ssh置顶_使用shell脚本启动远程(SSH)Java应用程序不会返回本地提示
  2. 将表里的数据批量生成INSERT语句的存储过程 增强版
  3. BI之SSAS完整实战教程3 -- 创建第一个多维数据集
  4. 阿里全面进军 IoT 两年后,又放大招!
  5. 远观近看阿里云ET平台 如何开启AI落地新风潮
  6. python读中文-python读写中文
  7. 芯片焊接和PCB设计引脚的长度及位置对于焊接质量的教训
  8. HuMoments函数
  9. VSTS 2010体验 - TFS 2010变化巨大
  10. 寒武纪讯飞京东等合搞AI芯片评测标准,作者包括陈云霁陈天石
  11. python做excel自动化-Python控制Excel实现自动化办公
  12. GET 和 POST 有什么区别?
  13. 一个JS下拉搜索框,日期级联控件
  14. 荣耀4a android art,荣耀4A黑科技大揭秘,真是给工程师给跪了!!
  15. Mahout in action 中文版-3.推荐器的数据表达
  16. 机器学习中的数学——常用概率分布(九):经验分布(Empirical分布)
  17. OpenAirInterface OAI 学生讨论QQ群
  18. bearer token_bearer token到底是什么?
  19. 在不同的浏览器下FORM及它的小伙伴们默认样式的CSS属性值是不完全一致
  20. 11个提高开关电源效率的小技巧

热门文章

  1. python bytes_Python bytes()
  2. jsf tree组件_JSF文本组件–标签,文本字段,文本区域和密码
  3. C++编程问题--glibc detected *** ./a.out: munmap_chunk(): invalid pointer: xxxxxx
  4. app测试--性能测试DDMS
  5. Spark源码阅读——任务提交过程
  6. spring-boot-devtools在Idea中热部署方法
  7. 类的加载顺序(例题)
  8. EF框架step by step(1)—Database-First
  9. 车是银色好还是白色好?
  10. linux下c语言url请求