[bzoj4818][Sdoi2017]序列计数_矩阵乘法_欧拉筛
[Sdoi2017]序列计数
题目大意:https://www.lydsy.com/JudgeOnline/problem.php?id=4818.
题解:
首先列出来一个递推式子
$f[i][0]$表示$i$个任意数的答案。
$f[i][1]$表示$i$个合数的答案。
转移的时候发现可以用矩阵优化这个过程。
至于怎么把矩阵建出来,我们可以开个桶来解决这个问题。
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 20170408 ;
char *p1, *p2, buf[100000];
#define nc() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 100000, stdin), p1 == p2) ? EOF : *p1 ++ )
int rd() {
int x = 0;
char c = nc();
while (c < 48) {
c = nc();
}
while (c > 47) {
x = (((x << 2) + x) << 1) + (c ^ 48), c = nc();
}
return x;
}
int p, n, m;
struct Matr {
int a[110][110];
Matr() {memset(a, 0, sizeof a);}
friend Matr operator * (const Matr &a, const Matr &b) {
Matr re;
for (int i = 0; i < p; i ++ ) {
for (int j = 0; j < p; j ++ ) {
for (int k = 0; k < p; k ++ ) {
(re.a[i][j] += (ll)a.a[i][k] * b.a[k][j] % mod) %= mod;
}
}
}
return re;
}
friend Matr operator ^ (Matr x, int y) {
Matr re;
for (int i = 0; i < p; i ++ ) {
re.a[i][i] = 1;
}
while (y) {
if (y & 1) {
re = re * x;
}
y >>= 1;
x = x * x;
}
return re;
}
}M, A;
int bu[110];
bool vis[20000010];
int prime[20000010], cnt;
int main() {
n = rd(), m = rd(), p = rd();
for (int i = 0; i < p; i ++ ) {
bu[i] = m / p;
if (i) {
if (i <= m % p) {
bu[i] ++ ;
}
}
}
for (int i = 0; i < p; i ++ ) {
for (int j = 0; j < p; j ++ ) {
M.a[i][j] = bu[(j - i + p) % p];
}
}
for (int i = 0; i < p; i ++ ) {
A.a[0][i] = bu[i];
}
A = A * (M ^ (n - 1));
int ans = A.a[0][0];
vis[1] = true;
for (int i = 2; i <= m; i ++ ) {
if (!vis[i]) {
prime[ ++ cnt] = i;
}
for (int j = 1; j <= cnt && (ll)i * prime[j] <= m; j ++ ) {
vis[i * prime[j]] = true;
if (i % prime[j] == 0) {
break;
}
}
}
for (int i = 1; i <= m; i ++ ) {
if (!vis[i]) {
bu[i % p] -- ;
}
}
for (int i = 0; i < p; i ++ ) {
A.a[0][i] = bu[i];
}
for (int i = 0; i < p; i ++ ) {
for (int j = 0; j < p; j ++ ) {
M.a[i][j] = bu[(j - i + p) % p];
}
}
A = A * (M ^ (n - 1));
printf("%d\n", (ans - A.a[0][0] + mod) % mod);
return 0;
}
小结:就是这种求存在的问题,可以转化成全部-不存在。
[bzoj4818][Sdoi2017]序列计数_矩阵乘法_欧拉筛的更多相关文章
- 【BZOJ4818】[Sdoi2017]序列计数 DP+矩阵乘法
[BZOJ4818][Sdoi2017]序列计数 Description Alice想要得到一个长度为n的序列,序列中的数都是不超过m的正整数,而且这n个数的和是p的倍数.Alice还希望 ,这n个数 ...
- 【BZOJ 4818】 4818: [Sdoi2017]序列计数 (矩阵乘法、容斥计数)
4818: [Sdoi2017]序列计数 Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 560 Solved: 359 Description Al ...
- 2019.02.11 bzoj4818: [Sdoi2017]序列计数(矩阵快速幂优化dp)
传送门 题意简述:问有多少长度为n的序列,序列中的数都是不超过m的正整数,而且这n个数的和是p的倍数,且其中至少有一个数是质数,答案对201704082017040820170408取模(n≤1e9, ...
- BZOJ4818 [SDOI2017] 序列计数 【矩阵快速幂】
题目分析: 一个很显然的同类项合并.注意到p的大小最大为100,考虑把模p意义下相同的求出来最后所有的减去没有质数的做矩阵快速幂即可. 代码: #include<bits/stdc++.h> ...
- BZOJ4818 LOJ2002 SDOI2017 序列计数 【矩阵快速幂优化DP】*
BZOJ4818 LOJ2002 SDOI2017 序列计数 Description Alice想要得到一个长度为n的序列,序列中的数都是不超过m的正整数,而且这n个数的和是p的倍数. Alice还希 ...
- [BZOJ4818][SDOI2017]序列计数(动规+快速幂)
4818: [Sdoi2017]序列计数 Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 972 Solved: 581[Submit][Status ...
- [Bzoj4818]序列计数(矩阵乘法+DP)
Description 题目链接 Solution 容斥原理,答案为忽略质数限制的方案数减去不含质数的方案数 然后矩阵乘法优化一下DP即可 Code #include <cstdio> # ...
- [LuoguP2151][SDOI2009]HH去散步_递推_矩阵乘法_图论
HH去散步 题目链接:https://www.luogu.org/problem/P2151 数据范围:略. 题解: 数据范围好小,让人不禁想用一些毒瘤算法,但是失败了. 这种类似时间啊这种有点重复味 ...
- [SDOI2017]序列计数 (矩阵加速,小容斥)
题面 Alice想要得到一个长度为n的序列,序列中的数都是不超过m的正整数,而且这n个数的和是p的倍数. Alice还希望,这n个数中,至少有一个数是质数. Alice想知道,有多少个序列满足她的要求 ...
随机推荐
- 【Python之路】特别篇--基于领域驱动模型架构设计的京东用户管理后台
一.预备知识: 1.接口: - URL形式 - 数据类型 (Python中不存在) a.类中的方法可以写任意个,想要对类中的方法进行约束就可以使用接口: b.定义一个接口,接口中定义一个方法f1: c ...
- Luogu P4109 [HEOI2015]定价 贪心
思路:找规律?$or$贪心. 提交:1次 题解: 发现:若可以构成$X0000$,答案绝对不会再在数字最后把$0$改成其他数: 若可以构成$XX50...0$更优. 所以左端点增加的步长是增加的($i ...
- html([val|fn])
html([val|fn]) 概述 取得第一个匹配元素的html内容.这个函数不能用于XML文档.但可以用于XHTML文档.直线电机选型 在一个 HTML 文档中, 我们可以使用 .html() 方法 ...
- react-native-page-scrollview 的使用方法(实现酷炫的分页轮播效果,还支持自定义View)
react-native-page-scrollview 对ScrollView的封装,可以很方便的实现水平,垂直分页轮播效果.而且可以自定义分页宽高,和侧边View的旋转,透明度,大小等. 对于原生 ...
- Error: 'The service did not respond in a timely fashion'
Windows启动时候报这个错,不应在OnStart放执行长的过程,需要开另一个线程来做才能顺利启动 Windows Services: OnStart loop - do I need to del ...
- 如何自己实现一个HTMLRunner
在使用unittest框架时,我们常常需要下载一个HTMLRunnerCN.py用来生成HTML格式的报告,那么我们能不能自己实现一个呢? HTMLRunner是模仿unittest自带的TextTe ...
- codeforces gym #101161G - Binary Strings(矩阵快速幂,前缀斐波那契)
题目链接: http://codeforces.com/gym/101161/attachments 题意: $T$组数据 每组数据包含$L,R,K$ 计算$\sum_{k|n}^{}F(n)$ 定义 ...
- 在docker容器中python3.5环境下使用DIGITS训练caffe模型
********* 此处使用的基础镜像为 nvcr.io/nvidia/digits:18.06,镜像大小为6.04GB,可从nvidia官方pull此镜像: 容器配置: CUDA:9.0 CUDNN ...
- maven mvn 命令行 编译打包
* 配置好jdk * 下载安装maven http://maven.apache.org/download.cgi apache-maven-3.3.3-bin.zip * 解压到G:\apache- ...
- session机制、cookie机制
一.Cookie机制 在web程序中是使用HTTP协议来传输数据的,因为http是无状态协议,一旦数据交换完毕,客户端和服务器端的连接就会关闭,再次交换数据需要建立新的连接,所以无法实现会话跟踪,co ...