[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想知道,有多少个序列满足她的要求 ...
随机推荐
- MFC、API、C++三者的区别
MFC(Microsoft Foundation Class)是微软的基础类库,只能用于Windows系统. API(Application Programming Interface)是应用程序编程 ...
- MariaDb 严格默认严格模式导致有 NULL 值新增失败 (sql_model STRICT)
分析: 由于 MaridDb 默认工作在严格模式下,所以导致无法 Insert 解决: 1 新增自定义配置 /etc/mysql/mariadb.conf.d/50-disable_strict_mo ...
- hdu 3555 Bomb(数位dp入门)
Bomb Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others) Total Subm ...
- bbs--文章后台
bbs--文章后台 需求分析 在个人文章后台中 1 有添加文章的接口 展示文章标题输入框 文本编辑框 标签 分类 选择框 提交 2 编辑文章的接口 页面与添加文章相同,就是把该文章的内容展示到文本编辑 ...
- Go程序的一生是怎样的?
Go 程序是怎样跑起来的 原创: 饶全成 码农桃花源 刚开始写这篇文章的时候,目标非常大,想要探索 Go 程序的一生:编码.编译.汇编.链接.运行.退出.它的每一步具体如何进行,力图弄清 Go 程序 ...
- 使用 kubeadm 安装 kubernetes v1.16.0
近日通过kubeadm 安装 kubernetes v1.16.0,踩过不少坑,现记录下安装过程. 安装环境: 系 统:CentOS Linux release 7.6 Docke ...
- 简述JAVA类的生命周期
介绍 一个java类的完整的生命周期会经历加载.连接.初始化.使用.和卸载五个阶段: 加载 主要是:把类的信息加载到方法区中,并在堆中实例化一个Class对象. 加载方式 根据类的全路径加载class ...
- 使用Xshell链接阿里云服务
1.下载Xshell,进入xshell官网 https://xshell.en.softonic.com/,选择免费版本进行下载,在该页面https://www.netsarang.com/zh/fr ...
- js判断滚动条是否已到页面最底部或顶部实例
原文 本文实例讲述了js判断滚动条是否已到页面最底部或顶部的方法.分享给大家供大家参考.具体分析如下: 我们经常会看到很多的网站一个返回顶部效果就是当我们滚动条到指定位置时返回顶部出来了,否则就自动隐 ...
- Linux Centos安装宝塔面板教程
材料:阿里云服务器远程ip地址和购买服务的账号和密码 版本Centos 6.9版本 用Xshell远程登录安装宝塔 Xshell的界面是这样的,如图 点击左上角新建回话可以创建一个新的SSH连接,如图 ...