[BZOJ 4818] [SDOI 2017] 序列计数
Description
Alice想要得到一个长度为 \(n\) 的序列,序列中的数都是不超过 \(m\) 的正整数,而且这 \(n\) 个数的和是 \(p\) 的倍数。
Alice还希望,这 \(n\) 个数中,至少有一个数是质数。
Alice想知道,有多少个序列满足她的要求。
Input
一行三个数,\(n,m,p\)。
Output
一行一个数,满足Alice的要求的序列数量,答案对 \(20170408\) 取模。
Sample Input
3 5 3
Sample Output
33
HINT
对 \(20\%\) 的数据,\(1\leq n,m\leq100\)
对 \(50\%\) 的数据,\(1\leq m \leq 100\)
对 \(80\%\) 的数据,\(1\leq m\leq 10^6\)
对 \(100\%\) 的数据,\(1\leq n \leq 10^9,1\leq m \leq 2\times 10^7,1\leq p\leq 100\)
Solution
设 \(f[i][j]\) 表示前 \(i\) 位之和模 \(p\) 等于 \(j\) 的方案数,\(g[i]\) 表示在模 \(p\) 意义下等于 \(i\) 的数的个数,有
\]
可构造出转移矩阵
g_0&g_{p-1}&\cdots&g_{1}\\
g_{1}&g_{0}&\cdots&g_{2}\\
\vdots&\vdots&\ddots&\vdots\\
g_{p-1}&g_{p-2}&\cdots&g_{0}
\end{bmatrix}
\begin{bmatrix}
f_0\\
f_1\\
\vdots\\
f_{p-1}
\end{bmatrix}
\]
最后用总的答案减去不包含质数的答案。
再科普一下NTT做法:
\]
Code
#include <cstdio>
#include <cstring>
const int N = 20000002, mod = 20170408;
int n, m, p, pr[N], np[N], tot, f[102], g[102];
struct Matrix {
int mat[102][102];
Matrix(){ memset(mat, 0, sizeof mat); }
Matrix operator * (const Matrix a) const {
Matrix b;
for (int i = 1; i <= p; ++i)
for (int j = 1; j <= p; ++j)
for (int k = 1; k <= p; ++k)
b.mat[i][j] = (b.mat[i][j] + 1LL * a.mat[i][k] * mat[k][j]) % mod;
return b;
}
} unit, a, b;
void sieve() {
np[1] = 1;
for (int i = 2; i <= m; ++i) {
if (!np[i]) pr[++tot] = i;
for (int j = 1; j <= tot && i * pr[j] <= m; ++j) {
np[i * pr[j]] = 1;
if (i % pr[j] == 0) break;
}
}
}
int ksm(Matrix a, int b) {
Matrix res = unit;
for (; b; b >>= 1, a = a * a)
if (b & 1) res = res * a;
return res.mat[1][1];
}
int main() {
scanf("%d%d%d", &n, &m, &p);
sieve();
for (int i = 1; i <= p; ++i) unit.mat[i][i] = 1;
for (int i = 1; i <= m; ++i) ++f[i % p];
for (int i = 1; i <= m; ++i) if (np[i]) ++g[i % p];
for (int i = 1; i <= p; ++i) {
int k = 1;
for (int j = i - 1; j >= 0; --j, ++k) a.mat[i][k] = f[j], b.mat[i][k] = g[j];
for (int j = p - 1; j >= i; --j, ++k) a.mat[i][k] = f[j], b.mat[i][k] = g[j];
}
printf("%d\n", (ksm(a, n) - ksm(b, n) + mod) % mod);
return 0;
}
[BZOJ 4818] [SDOI 2017] 序列计数的更多相关文章
- [BZOJ 4818/LuoguP3702][SDOI2017] 序列计数 (矩阵加速DP)
题面: 传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=4818 Solution 看到这道题,我们不妨先考虑一下20分怎么搞 想到暴力,本蒟 ...
- [SDOI 2017] 序列计数
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=4818 [算法] 考虑容斥 , 用有至少有一个质数的合法序列数 - 没有质数的合法序列 ...
- [BZOJ 3992] [SDOI 2015] 序列统计(DP+原根+NTT)
[BZOJ 3992] [SDOI 2015] 序列统计(DP+原根+NTT) 题面 小C有一个集合S,里面的元素都是小于质数M的非负整数.他用程序编写了一个数列生成器,可以生成一个长度为N的数列,数 ...
- BZOJ 3992 [SDOI 2015] 序列统计 解题报告
这个题最暴力的搞法就是这样的: 设 $Dp[i][j]$ 为前 $i$ 个数乘积为 $j$ 的方案数. 转移的话就不多说了哈... 当前复杂度 $O(nm^2)$ 注意到,$M$ 是个质数,就说明 $ ...
- [BZOJ 3992] [SDOI 2015] 序列统计
Description 传送门 Solution [一] 设 \(f[i][j]\) 表示前 \(i\) 个数的乘积在模 \(p\) 意义下等于 \(j\) 的方案数,有 \[ f[i][j]=\su ...
- [BZOJ 4817] [SDOI 2017] 树点涂色
Description Bob有一棵 \(n\) 个点的有根树,其中 \(1\) 号点是根节点.Bob在每个点上涂了颜色,并且每个点上的颜色不同. 定义一条路径的权值是:这条路径上的点(包括起点和终点 ...
- [BZOJ 4819] [SDOI 2017] 新生舞会
Description 学校组织了一次新生舞会,Cathy作为经验丰富的老学姐,负责为同学们安排舞伴. 有 \(n\) 个男生和 \(n\) 个女生参加舞会买一个男生和一个女生一起跳舞,互为舞伴. C ...
- 【BZOJ 4818】 4818: [Sdoi2017]序列计数 (矩阵乘法、容斥计数)
4818: [Sdoi2017]序列计数 Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 560 Solved: 359 Description Al ...
- BZOJ4818 序列计数
4818: [Sdoi2017]序列计数 Time Limit: 30 Sec Memory Limit: 128 MB Description Alice想要得到一个长度为n的序列,序列中的数都是 ...
随机推荐
- js 递归修改json无限级key值
var tree = [ { name: 'node1' }, { name: 'node2', children: [{ name: 'node-2-1' }, { name: 'node2-2' ...
- python地理处理包——pySAL使用
Pysal是基于Python的开源地理处理库,能提供高层次的空间分析功能.
- 关于MongoDB 固定集合(capped collection)的知识梳理
一 . 什么是固定集合 MongoDB中有一种特殊类型的集合,值得我们特别留意,那就是固定集合(capped collection). 固定集合可以声明collection的容量大小,其行为类似于循环 ...
- 使用 Dashboard - 每天5分钟玩转 Docker 容器技术(174)
上一节我们完成了 Kubernetes Dashboard 的安装,本节就来实践一下. Dashboard 界面结构 Dashboard 的界面很简洁,分为三个大的区域. 顶部操作区在这里用户可以搜索 ...
- Oracle的ORA-02292报错:违反完整性约束,已找到子记录
第一种方法: 第一步就是找到子表的记录: select a.constraint_name, a.table_name, b.constraint_name from user_constraints ...
- Python函数(一)之杵臼之交
Python函数 函数的作用:对功能进行封装,减少重复代码,方便维护,流程清晰明了,易于理解. 函数的结构: def 函数名(): 函数体 return语句 函数的返回值: 可以 ...
- Linux内核的冷热缓存
缓存为什么会有冷热? 究其原因,是因为对于内存的访问,可能是CPU发起的,也可以是DMA设备发起的. 如果是CPU发起的,在CPU的硬件缓存中,就会保存相应的页内容.如果这个页本来没有存在于硬件缓存中 ...
- 【技术文章】《快速上手nodejs》
本文地址:http://www.cnblogs.com/aiweixiao/p/8294814.html 原文地址: 扫码关注微信公众号 1.写在前面 nodejs快速上手 nodejs使ja ...
- 一篇文章搞定mongodb
一 安装 1 安装目录下新建文件夹data,etc,logs #在bin文件下启动cmd,指定数据存储的路径mongod --dbpath D:\MongoDB\data\db 2 etc文件夹中新建 ...
- C#基础知识之面向对象以及面向对象的三大特性
在C#基础知识之类和结构体中我详细记录了类.类成员.重载.重写.继承等知识总结.这里就记录一下对面向对象和面向对象三大特性的广义理解. 一.理解面向对象 类是面向对象编程的基本单元,面向对象思想其实就 ...