• 源自 ditoly 大爷的 FJ 省队集训课件

Statement

  • 有 \(m\) 个正整数变量,求有多少种取值方案

  • 使得所有变量的和不超过 \(S\)

  • 并且前 \(n\) 个变量的值都不超过 \(t\)

  • 答案对 \(10^9+7\) 取模

  • \(m-n\le1000\) ,\(m\le 10^9\) ,\(t\le 10^5\) ,\(nt\le s\le 10^{18}\)

Solution

  • 由于 \(nt\le s\le 10^{18}\) ,所以我们的解可以表示成:

  • \[\sum_{x_1=1}^t\sum_{x_2=1}^t\dots\sum_{x_n=1}^t\binom{S-\sum_{i=1}^nx_i}{m-n}
    \]

  • 设 \(s=S-(m-n)+1-\sum_{i=1}^nx_i\)

  • 注意到上面的和式里面的组合数是一个关于 \(s\) 的多项式,具体地,它等于 \(\frac{s^{\overline{m-n}}}{(m-n)!}\)

  • 其中 \(n^{\overline m}\) 表示 \(n\) 的 \(m\) 次上升幂,即 \(\prod_{i=0}^{m-1}(n+i)\)

  • 由第一类斯特林数的生成函数可得,这个多项式的 \(i\) 次项系数为 \(\frac{\begin{bmatrix}m-n\\i\end{bmatrix}}{(m-n)!}\) ,其中 \(\begin{bmatrix}n\\m\end{bmatrix}\) 为第一类斯特林数,即把 \(n\) 个元素分成 \(m\) 个圆排列的方案数

  • 把组合数表示成多项式的形式之后,我们考虑如果我们求出了在前 \(n\) 个变量所有 \(t^n\) 种取值下对应的 \(s^i\) (\(0\le i\le m-n\))之和,那么问题就能很好地解决了

  • 考虑 DP:\(f[i][j]\) 表示 \(x_{1\dots i}\) 所有取值下 \((S-m+n+1-\sum_{k=1}^ix_k)^j\) 的和

  • 考虑如何从 \(f[i]\) 转移到 \(f[i+1]\)

  • 这个转移即枚举 \(x_{i+1}\) 的取值,设 \(s=S-m+n+1-\sum_{k=1}^ix_k\)

  • 可以发现:

  • \[\sum_{k=1}^t(s-k)^j=\sum_{k=0}^j(-1)^{j-k}\binom jks^ksum(j-k,t)
    \]

  • 其中 \(sum(p,n)=\sum_{i=1}^ni^p\) ,可以利用插值 \(O(p)\) 求出

  • 于是我们有了一个 DP 转移:

  • \[f[i+1][j]=\sum_{k=0}^j(-1)^{j-k}\binom jksum(j-k,t)f[i][k]
    \]

  • 把组合数拆开:

  • \[\frac{f[i+1][j]}{j!}=\sum_{k=0}^j\frac{(-1)^{j-k}sum(j-k,t)}{(j-k)!}\frac{f[i][k]}{k!}
    \]

  • 设多项式 \(F_i(x)=\sum_{j=0}^{m-n}f[i][j]x^j\) ,\(G(x)=\sum_{i=0}^{m-n}\frac{(-1)^isum(i,t)}{i!}x^i\)

  • 那么很容易得到 \(F_n(x)=G(x)^n\) ,倍增快速幂即可

  • 复杂度 \(O((m-n)^2\log n)\) 或 \(O((m-n)^2)\)

Code

#include <bits/stdc++.h>

const int N = 1010, rqy = 1e9 + 7;

typedef long long ll;

ll s;
int t, n, m, l, pw[N][N], f[N], fac[N], inv[N], invt[N], g[N], ans, S[N][N]; int qpow(int a, int b)
{
int res = 1;
while (b)
{
if (b & 1) res = 1ll * res * a % rqy;
a = 1ll * a * a % rqy;
b >>= 1;
}
return res;
} int calc(int T)
{
int sum = 0, res = 0, al = 1;
for (int i = 1; i <= T + 2; i++) al = 1ll * al * (t - i + rqy) % rqy;
for (int i = 1; i <= T + 2; i++)
{
sum = (sum + pw[i][T]) % rqy;
if (i == t) return sum;
int delta = 1ll * al * invt[i] % rqy *
inv[i - 1] % rqy * inv[T + 2 - i] % rqy;
if (T + 2 - i & 1) delta = (rqy - delta) % rqy;
res = (1ll * delta * sum + res) % rqy;
}
return res;
} int main()
{
std::cin >> s >> t >> n >> m;
l = m - n; s -= l - 1;
f[0] = fac[0] = inv[0] = inv[1] = 1;
for (int i = 1; i <= l + 2; i++) fac[i] = 1ll * fac[i - 1] * i % rqy;
for (int i = 2; i <= l + 2; i++)
inv[i] = 1ll * (rqy - rqy / i) * inv[rqy % i] % rqy;
for (int i = 2; i <= l + 2; i++) inv[i] = 1ll * inv[i] * inv[i - 1] % rqy;
for (int i = 1; i <= l + 2; i++)
{
pw[i][0] = 1;
for (int j = 1; j <= l; j++) pw[i][j] = 1ll * pw[i][j - 1] * i % rqy;
}
for (int i = 1; i <= l + 2; i++) invt[i] = qpow((t - i + rqy) % rqy, rqy - 2);
for (int i = 1; i <= l; i++) f[i] = s % rqy * f[i - 1] % rqy;
for (int i = 0; i <= l; i++) f[i] = 1ll * f[i] * inv[i] % rqy;
for (int i = 0; i <= l; i++)
{
g[i] = 1ll * calc(i) * inv[i] % rqy;
if (i & 1) g[i] = (rqy - g[i]) % rqy;
}
while (n)
{
if (n & 1) for (int i = l; i >= 0; i--)
{
f[i] = 1ll * f[i] * g[0] % rqy;
for (int j = 1; j <= i; j++)
f[i] = (1ll * f[i - j] * g[j] + f[i]) % rqy;
}
for (int i = l; i >= 0; i--)
{
g[i] = 1ll * g[i] * g[0] % rqy;
if (i) g[i] = (g[i] + g[i]) % rqy;
for (int j = 1; j < i; j++)
g[i] = (1ll * g[i - j] * g[j] + g[i]) % rqy;
}
n >>= 1;
}
S[0][0] = 1;
for (int i = 1; i <= l; i++)
for (int j = 1; j <= i; j++)
S[i][j] = (1ll * S[i - 1][j] * (i - 1) + S[i - 1][j - 1]) % rqy;
for (int i = 0; i <= l; i++)
ans = (1ll * f[i] * fac[i] % rqy * S[l][i] + ans) % rqy;
return std::cout << 1ll * ans * inv[l] % rqy << std::endl, 0;
}

[组合数学][多项式][拉格朗日插值]count的更多相关文章

  1. 多项式函数插值:全域多项式插值(一)单项式基插值、拉格朗日插值、牛顿插值 [MATLAB]

    全域多项式插值指的是在整个插值区域内形成一个多项式函数作为插值函数.关于多项式插值的基本知识,见“计算基本理论”. 在单项式基插值和牛顿插值形成的表达式中,求该表达式在某一点处的值使用的Horner嵌 ...

  2. P4463 [集训队互测2012] calc 拉格朗日插值 dp 多项式分析

    LINK:calc 容易得到一个nk的dp做法 同时发现走不通了 此时可以考虑暴力生成函数. 不过化简那套不太熟 且最后需要求多项式幂级数及多项式exp等难写的东西. 这里考虑观察优化dp的做法. 不 ...

  3. luogu P5667 拉格朗日插值2 拉格朗日插值 多项式多点求值 NTT

    LINK:P5667 拉格朗日插值2 给出了n个连续的取值的自变量的点值 求 f(m+1),f(m+2),...f(m+n). 如果我们直接把f这个函数给插值出来就变成了了多项式多点求值 这个难度好像 ...

  4. P3270 [JLOI2016]成绩比较 容斥 数论 组合数学 拉格朗日插值

    LINK:成绩比较 大体思路不再赘述 这里只说几个我犯错的地方. 拉格朗日插值的时候 明明是n次多项式 我只带了n个值进去 导致一直GG. 拉格朗日插值的时候 由于是从1开始的 所以分母是\((i-1 ...

  5. 洛谷 P3270 - [JLOI2016]成绩比较(容斥原理+组合数学+拉格朗日插值)

    题面传送门 考虑容斥.我们记 \(a_i\) 为钦定 \(i\) 个人被 B 神碾压的方案数,如果我们已经求出了 \(a_i\) 那么一遍二项式反演即可求出答案,即 \(ans=\sum\limits ...

  6. Educational Codeforces Round 7 F - The Sum of the k-th Powers 拉格朗日插值

    The Sum of the k-th Powers There are well-known formulas: , , . Also mathematicians found similar fo ...

  7. 常系数齐次线性递推 & 拉格朗日插值

    常系数齐次线性递推 具体记在笔记本上了,以后可能补照片,这里稍微写一下,主要贴代码. 概述 形式: \[ h_n = a_1 h_{n-1}+a_2h_{n-2}+...+a_kh_{n-k} \] ...

  8. 【XSY1537】五颜六色的幻想乡 数学 生成树计数 拉格朗日插值

    题目大意 ​ 有一个\(n\)个点\(m\)条边的图,每条边有一种颜色\(c_i\in\{1,2,3\}\),求所有的包括\(i\)条颜色为\(1\)的边,\(j\)条颜色为\(2\)的边,\(k\) ...

  9. 【BZOJ2655】calc DP 数学 拉格朗日插值

    题目大意 ​ 一个序列\(a_1,\ldots,a_n\)是合法的,当且仅当: ​ 长度为给定的\(n\). ​ \(a_1,\ldots,a_n\)都是\([1,m]\)中的整数. ​ \(a_1, ...

随机推荐

  1. 【21.58%】【codeforces 746D】Green and Black Tea

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

  2. Leecoder466 Count The Repetitons

    Leecoder466 Count The Repetitons 题目大意 定义\([s,n]\)为连续\(n\)个串\(s\)构成的串 现在给定\(s_1,n_1,s_2,n_2\),求最大的\(m ...

  3. vue项目使用websocket做聊天项目总结

    一.首先我们先了解一下websocket的使用: 1.创建websocket const ws = new WebSocket("ws://192.168.31.136:9998/ws&qu ...

  4. Visio高级应用部件

    标注与公式的应用: 插入标注 怎么让标注与图形建立关联:拖动标注的时候坐下角会出现黄色的点 把标准拖动到形状边的时候让黄点进入形状就是建立了关联 然后标注就会随着形状的移动而移动 而且复制和删除也都是 ...

  5. 20191017-5 alpha week 2/2 Scrum立会报告+燃尽图 04

    此作业要求参见https://edu.cnblogs.com/campus/nenu/2019fall/homework/9801 小组名称:“组长”组 组长:杨天宇 组员:魏新,罗杨美慧,王歆瑶,徐 ...

  6. win32简单的sockeTCP协议通信

    什么也不说了看代码 首先是服务端代码 #include <stdio.h> #include <stdlib.h> #include <WinSock2.h> #i ...

  7. $Luogu4403$ 秦腾与教学评估 二分

    $Luogu$ $Description$ 有$N$个数列,求一个$x$,$x$在各个数列中的出现次数之和为奇数.这样的$x$最多存在$1$个.若不存在则输出Poor QIN Teng:( $Sol$ ...

  8. $Poj2376\ Poj3171\ Luogu4644\ Cleaning\ Shifts$ 数据结构优化$DP$

    $Poj$    $AcWing$    $Luogu$ $ps:$洛谷题目与$Poj$略有不同,以下$Description$是$Poj$版.题目的不同之处在于洛谷中雇用奶牛的费用不相同,所以不可以 ...

  9. Windows Live Writer 语法高亮

    1.WindowsLiveWriter.CNBlogs.CodeHighlighter.rar 这个插件生成的高亮代码与网页上的一模一样,插入后即可立即显示效果,不过貌似它必须联网才能实时显示效果,因 ...

  10. Angular Schematics 三部曲之 Add

    前言 因工作繁忙,差不多有三个月没有写过技术文章了,自八月份第一次编写 schematics 以来,我一直打算分享关于 schematics 的编写技巧,无奈还是拖到了年底. Angular Sche ...