[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]序列计数_矩阵乘法_欧拉筛的更多相关文章

  1. 【BZOJ4818】[Sdoi2017]序列计数 DP+矩阵乘法

    [BZOJ4818][Sdoi2017]序列计数 Description Alice想要得到一个长度为n的序列,序列中的数都是不超过m的正整数,而且这n个数的和是p的倍数.Alice还希望 ,这n个数 ...

  2. 【BZOJ 4818】 4818: [Sdoi2017]序列计数 (矩阵乘法、容斥计数)

    4818: [Sdoi2017]序列计数 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 560  Solved: 359 Description Al ...

  3. 2019.02.11 bzoj4818: [Sdoi2017]序列计数(矩阵快速幂优化dp)

    传送门 题意简述:问有多少长度为n的序列,序列中的数都是不超过m的正整数,而且这n个数的和是p的倍数,且其中至少有一个数是质数,答案对201704082017040820170408取模(n≤1e9, ...

  4. BZOJ4818 [SDOI2017] 序列计数 【矩阵快速幂】

    题目分析: 一个很显然的同类项合并.注意到p的大小最大为100,考虑把模p意义下相同的求出来最后所有的减去没有质数的做矩阵快速幂即可. 代码: #include<bits/stdc++.h> ...

  5. BZOJ4818 LOJ2002 SDOI2017 序列计数 【矩阵快速幂优化DP】*

    BZOJ4818 LOJ2002 SDOI2017 序列计数 Description Alice想要得到一个长度为n的序列,序列中的数都是不超过m的正整数,而且这n个数的和是p的倍数. Alice还希 ...

  6. [BZOJ4818][SDOI2017]序列计数(动规+快速幂)

    4818: [Sdoi2017]序列计数 Time Limit: 30 Sec  Memory Limit: 128 MBSubmit: 972  Solved: 581[Submit][Status ...

  7. [Bzoj4818]序列计数(矩阵乘法+DP)

    Description 题目链接 Solution 容斥原理,答案为忽略质数限制的方案数减去不含质数的方案数 然后矩阵乘法优化一下DP即可 Code #include <cstdio> # ...

  8. [LuoguP2151][SDOI2009]HH去散步_递推_矩阵乘法_图论

    HH去散步 题目链接:https://www.luogu.org/problem/P2151 数据范围:略. 题解: 数据范围好小,让人不禁想用一些毒瘤算法,但是失败了. 这种类似时间啊这种有点重复味 ...

  9. [SDOI2017]序列计数 (矩阵加速,小容斥)

    题面 Alice想要得到一个长度为n的序列,序列中的数都是不超过m的正整数,而且这n个数的和是p的倍数. Alice还希望,这n个数中,至少有一个数是质数. Alice想知道,有多少个序列满足她的要求 ...

随机推荐

  1. MacOs High Sierra 升级失败解决办法

    进入recovery的方法: Command-R 重新安装您在 Mac 上安装过的最新 macOS,但不会升级到更高的版本. Option-Command-R升级到与您的 Mac 兼容的最新 macO ...

  2. [Luogu] 维护序列

    https://www.luogu.org/problemnew/show/P2023 线段树双懒标记下放 #include <bits/stdc++.h> using namespace ...

  3. Cogs 14. [网络流24题] 搭配飞行员(二分图匹配)

    [网络流24题] 搭配飞行员 ★★☆ 输入文件:flyer.in 输出文件:flyer.out 简单对比 时间限制:1 s 内存限制:128 MB [问题描述] 飞行大队有若干个来自各地的驾驶员,专门 ...

  4. 【线性代数】1-0:向量(Vector)

    title: [线性代数]1-0:向量(Vector) toc: true categories: Mathematic Linear Algebra date: 2017-08-28 10:01:2 ...

  5. 【面试】ArrayList 和 HaseMap 的区别和应用场景

    ArrayLiat: ArrayList array = new ArrayList(); array.add("张三"); array.add("李四"); ...

  6. openapi and light-4j

    light-4j项目支持openapi规范,本文介绍一下参照相关demo做的上传功能. openapi.yaml,按照规范编写内容,/openapi/swagger可以查看对应的swagger页面,A ...

  7. crawler 使用jQuery风格实现

    以前写过java版的crawler,最近看了Groovy的XmlSlurper,效果还是不太满意,直到这篇文章启发了我:how-to-make-a-simple-web-crawler-in-java ...

  8. centos6安装sshpass

    跳转机需要装这个 #!/bin/bash yum -y install gcc-c++ openssh-clients curl -o sshpass.tar.gz http://sourceforg ...

  9. 括号序列模型--序列dp--U86873 小Y的精灵国机房之旅

    括号序列模型及解法 >Codeforces314E◦给定一个长度为n的仅包含左右括号和问号的字符串,将问号变成左括号或右括号使得该括号序列合法,求方案总数.◦例如(())与()()都是合法的括号 ...

  10. SQL:百科

    ylbtech-SQL:百科 结构化查询语言(Structured Query Language)简称SQL,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询.更新和管理 ...