[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的序列,序列中的数都是 ...
随机推荐
- vue 中promise 异步请求数据
export function getTypes(type) { return listDictItems({ code: type }).then((res) => { if (res.cod ...
- angular路由为空重定向到指定路由
{ path: '', redirectTo: 'home', pathMatch: 'full' }
- iOS----------常见经典错误
最近使用cocoapods集成友盟 发现几个经典错误 1.clang: error: linker command failed with exit code 1 (use -v to see in ...
- 微信小程序(四) 模板的使用
模板的使用:单独建立一个页面,在另一个页面通过name属性名调用使用(注意要导入模板路径) template.wxml页面
- android 开发之 ListView 与Adapter 应用实践
在开发android中,ListView 的应用显得非常频繁,只要需要显示列表展示的应用,可以说是必不可少,下面是记录开发中应用到ListView与Adapter 使用的实例: ListView 所在 ...
- 新版的nuget包 PackageLicense 这样写
Intro 最近编译类库项目的时候发现总是有个 licenseUrl 的警告,警告信息如下: warning NU5125: The 'licenseUrl' element will be depr ...
- iOS中Realm数据库的基本用法
原文 http://git.devzeng.com/blog/simple-usage-of-realm-in-ios.html 主题 RealmiOS开发 Realm是由 Y Combinat ...
- python进阶之time模块详解
Time模块 Time模块包含的函数 Time模块包含了一下内置的函数,既有时间处理的,也有转换时间格式的: 序号 函数及描述 1 time.altzone 返回格林威治西部的夏令时地区的偏移秒数.如 ...
- 英语口语练习系列-C14-常用片语
句子 1. Some ads are extremely persuasive and we find we buy products we don't really need. 有一些广告非常有说服 ...
- Java开发学习心得(三):项目结构
[TOC] 3 项目结构 经过前面一系列学习,差不多对Java的开发过程有了一定的了解,为了能保持一个良好的项目结构,考虑到接下来要进行开发,还需要学习一下Java的项目结构 下面以两个项目结构为参照 ...