题意

有一个长为 \(N\) 的序列 \(A = [1, 2, 3, \dots, N]\) ,求所有长度 \(\le K\) 的子串权值积的和,对于 \(M\) 取模。

\(N \le 10^{18}, K \le \min(600, n), M \le 10^{18}\)

题解

一道还有些意思的组合数学题 qwq

一开始觉得这不是 \(K​\) 次多项式么,直接插值QAQ 发现模数不给,逆元可能都没有,太不友好啦。

令 \(ans_k\) 为长度为 \(k\) 的子串的贡献和。其实我们就是求对于所有 \(k \le K\) 的 \(ans_k\) 的和。

先推推式子。

\[\begin{aligned}
ans_k &= \sum_{i = k}^{n} \frac{i!}{(i - k)!}\\
&= k! \sum_{i = k}^{n} {i \choose k}\\
&= k! {n + 1 \choose k + 1}
\end{aligned}
\]

那么我们最后就是求对于所有 \(k \le K\) 的 \(k!\) 和 \(\displaystyle {n + 1 \choose k +1}\) 。

前者很好求,对于后者么。。。组合数,\(n\) 好大。。\(Lucas\) ?\(m\) 也好大。。。弃疗

但我们会发现 \(k\) 其实不是很大QAQ

我们需要知道有这样一个东西

\[{n + m \choose r} = \sum_{k = 0}^{r} {n \choose k} \times {m \choose r - k}
\]

为什么呢?思考一下组合意义就很明显啦。

当 \(n = m\) 的时候就有

\[{2n \choose r} = \sum_{k = 0}^{r} {n \choose k} \times {n \choose r - k}
\]

有了这个就很好做啦~

我们维护一个序列 \(A_i\) 为 \(\displaystyle [{i \choose 0}, {i \choose 1}, \dots, {i \choose K + 1}]\) 。最后我们要求的就是 \(A_{N + 1}\) 。

那么有前面那个式子,我们就可以倍增求出 \(A_n\) 啦。

所以复杂度是 \(O(k^2 \log n)\) 的。(默认不适用慢速乘,用 __int128

前面那个是卷积的形式,也可以用 \(FFT\) 优化到 \(O(k \log k \log n)\) ,但由于模数很鬼畜,似乎没有那么优秀。

代码

#include <bits/stdc++.h>

#define For(i, l, r) for (register int i = (l), i##end = (int)(r); i <= i##end; ++i)
#define Fordown(i, r, l) for (register int i = (r), i##end = (int)(l); i >= i##end; --i)
#define Rep(i, r) for (register int i = (0), i##end = (int)(r); i < i##end; ++i)
#define Set(a, v) memset(a, v, sizeof(a))
#define Cpy(a, b) memcpy(a, b, sizeof(a))
#define debug(x) cout << #x << ": " << (x) << endl using namespace std; using ll = __int128; template<typename T> inline bool chkmin(T &a, T b) { return b < a ? a = b, 1 : 0; }
template<typename T> inline bool chkmax(T &a, T b) { return b > a ? a = b, 1 : 0; } template<typename T>
inline T read() {
T x(0), sgn(1); char ch(getchar());
for (; !isdigit(ch); ch = getchar()) if (ch == '-') sgn = -1;
for (; isdigit(ch); ch = getchar()) x = (x * 10) + (ch ^ 48);
return x * sgn;
} void File() {
#ifdef zjp_shadow
freopen ("sliding-product-sum.in", "r", stdin);
freopen ("sliding-product-sum.out", "w", stdout);
#endif
} const int N = 610; ll n, Mod; int k; struct Array { ll a[N]; Array() { Set(a, 0); } inline Array friend operator * (const Array &lhs, const Array &rhs) {
Array res;
For (i, 0, k) For (j, 0, k - i)
res.a[i + j] = (res.a[i + j] + lhs.a[i] * rhs.a[j]) % Mod;
return res;
} }; ll fac[N]; Array fpm(Array x, ll power) {
Array res = x; -- power;
for (; power; power >>= 1, x = x * x)
if (power & 1) res = res * x;
return res;
} int main() { File(); n = read<ll>() + 1;
k = read<int>() + 1;
Mod = read<ll>(); Array base; base.a[0] = base.a[1] = 1; Array prod = fpm(base, n); fac[0] = 1;
For (i, 1, k) fac[i] = fac[i - 1] * i % Mod; ll ans = 0;
For (i, 2, k)
ans = (ans + fac[i - 1] * prod.a[i]) % Mod;
printf ("%lld\n", (long long)(ans)); return 0; }

CS Academy Sliding Product Sum(组合数)的更多相关文章

  1. [codeforces631E]Product Sum

    E. Product Sum time limit per test: 1 second memory limit per test: 256 megabytes input:standard inp ...

  2. Codeforces Round #344 (Div. 2) E. Product Sum 维护凸壳

    E. Product Sum 题目连接: http://www.codeforces.com/contest/631/problem/E Description Blake is the boss o ...

  3. CS Academy Distinct Neighbours(经典dp)

    CS Academy Distinct Neighbours(经典dp) 题意: 求相邻无相同数字的合法的排列数 题解: 题解 先将相同的数字分为一类,假设共有n组 定义\(dp[i][j]\)表示前 ...

  4. Codeforces Round #344 (Div. 2) E. Product Sum 二分斜率优化DP

    E. Product Sum   Blake is the boss of Kris, however, this doesn't spoil their friendship. They often ...

  5. CS Academy Gcd on a Circle(dp + 线段树)

    题意 给你一个长为 \(n\) 的环,你可以把它断成任意 \(k\) 段 \((1 < k \le n)\) ,使得每一段的 \(\gcd\) 都 \(>1\) . 问总共有多少种方案,对 ...

  6. Codeforces 631E Product Sum 斜率优化

    我们先把问题分成两部分, 一部分是把元素往前移, 另一部分是把元素往后移.对于一个 i 后的一个位置, 我们考虑前面哪个移到这里来最优. 我们设最优值为val,   val = max(a[ j ] ...

  7. CS academy Binary Flips(dp)

    开学啦,没啥时间写博客..过几天就能又停课啦qwq 做点中等 \(dp\) 题来找找 noip 的感觉 233 题意 原题戳这里. 给你一个 \(n \times m\) 的矩阵 \(A\) ,一开始 ...

  8. CS Academy Round #65 Count Arrays (DP)

    题目链接  Count Arrays 题意  给定$n$和$m$个区间.若一个长度为$n$的$01$序列满足对于每一个给定的区间中至少有一个位置是$0$, 那么这个$01$序列满足条件.求有多少满足条 ...

  9. CS Academy #32 G

    题意: 分析: 考虑如何求方案数 dp[i][j]表示i个数字的和为j的方案数,这是个经典问题,转移有两种,一个是填一个数字1,一个是整体加1 然后这个问题并不是求方案数,而是求对应的权值和 我们很容 ...

随机推荐

  1. YARN的笔记

  2. 快速失败/报错机制 - fail-fast

    一.快速报错机制(fail-fast) 这是<Java编程思想>中关于快速报错机制的描述 Java容器有一种保护机制,能够防止多个进程同时修改同一个容器的内容.如果在你迭代遍历容器的过程中 ...

  3. Is there a way to avoid undeployment memory leaks in Tomcat?

    tomcat 项目部署问题 - yshy - 博客园http://www.cnblogs.com/yshyee/p/3973293.html jsp - tomcat - their classes ...

  4. Nginx三部曲(3)SSL

    我们将告诉你 Nginx 的运作模式.蕴含的概念,怎样通过调优 Nginx 来提高应用性能,或是如何设置它的启动和运行. 这个教程有三个部分: 基本概念 —— 这部分需要去了解 Nginx 的一些指令 ...

  5. [转帖]NUMA

    作者:ibless 来源:CSDN 原文:https://blog.csdn.net/ibless/article/details/80114009 其实 很早之前对这一块有了解 比较多的的是 CCN ...

  6. linux安装httpd,做文件服务器

    在一个团队或者公司层面上,做一个本地的文件服务器,将网上的资源下载到本地,是有必要的.这将节省其他人的很多下载时间. >>提君博客原创  http://www.cnblogs.com/ti ...

  7. java中级——二叉树比较冒泡和选择排序

    上次我们说到二叉树排序比较,给出如下的题目 题目:创建五万个随机数,然后用分别用冒泡法,选择法,二叉树3种排序算法进行排序,比较哪种更快 废话不说直接上源码,可以看控制台结果 注意的是 需要我们需要上 ...

  8. 读懂掌握 Python logging 模块源码 (附带一些 example)

    搜了一下自己的 Blog 一直缺乏一篇 Python logging 模块的深度使用的文章.其实这个模块非常常用,也有非常多的滥用.所以看看源码来详细记录一篇属于 logging 模块的文章. 整个 ...

  9. 老男孩python学习自修第八天【函数式编程】

    1.可变参数,将传参自动汇总成列表 2.可变参数,将参数自动汇总成字典 实战如下: #!/usr/bin/env python # _*_ coding:UTF-8 _*_ def show(*arg ...

  10. Java权限访问修饰符

    私有的,以 private 修饰符指定,在同一类内可见. 默认的,也称为 default,在同一包内可见,不使用任何修饰符. 受保护的,以 protected 修饰符指定,对同一包内的类和所有子类可见 ...