题目

https://www.lydsy.com/JudgeOnline/problem.php?id=4818

思路

先考虑没有质数限制

dp是在同余系下的,所以\(f[i][j]\)表示前i个点,和为j的方案数

转移就是\(f[i][j]=f[i-1][k]+g[(j-k)\%p]\)

g[i]是x%p==i出现的个数

有质数的话

用tot-无质数

无质数就在g[i]上删去质数出现的个数,再跑一边

但是!!

n很大,应该是带个log的

矩阵优化吧

代码

#include <bits/stdc++.h>
using namespace std;
const int mod = 20170408;
const int N = 1e5 + 7;
int read() {
int x = 0, f = 1;
char s = getchar();
for (; s > '9' || s < '0'; s = getchar())
if (s == '-')
f = -1;
for (; s >= '0' && s <= '9'; s = getchar()) x = x * 10 + s - '0';
return x * f;
}
int n, m, p;
int pri[2000008], cnt;
bool vis[20000008];
void get_pri(int n) {
vis[1] = 1;
for (int i = 2; i <= n; ++i) {
if (!vis[i])
pri[++cnt] = i;
for (int j = 1; i * pri[j] <= n && j <= cnt; ++j) {
vis[i * pri[j]] = 1;
if (i % pri[j] == 0)
break;
}
}
}
struct node {
int ch[201][201];
} a, b, c;
node mul(node a, node b) {
node c = {};
for (int i = 0; i < p; ++i)
for (int k = 0; k < p; ++k)
for (int j = 0; j < p; ++j) c.ch[i][j] = (c.ch[i][j] + 1LL * a.ch[i][k] * b.ch[k][j] % mod) % mod;
return c;
}
node q_pow(node a, int nb) {
node ans = {};
for (int i = 0; i < p; ++i) ans.ch[i][i] = 1;
while (nb) {
if (nb & 1)
ans = mul(ans, a);
a = mul(a, a);
nb >>= 1;
}
return ans;
}
int g[200];
int main() {
// freopen("count.in","r",stdin);
// freopen("count.out","w",stdout);
n = read(), m = read(), p = read();
get_pri(m);
// one
for (int i = 1; i <= m; ++i) g[i % p]++;
for (int i = 0; i < p; ++i)
for (int j = 0; j < p; ++j) a.ch[i][j] = g[(i - j + p) % p];
for (int i = 0; i < p; ++i) b.ch[i][0] = g[i];
c = mul(q_pow(a, n - 1), b);
int ans = c.ch[0][0];
memset(g, 0, sizeof(g));
memset(a.ch, 0, sizeof(a.ch));
memset(b.ch, 0, sizeof(b.ch));
memset(c.ch, 0, sizeof(c.ch)); // two
for (int i = 1; i <= m; ++i)
if (vis[i])
g[i % p]++;
for (int i = 0; i < p; ++i)
for (int j = 0; j < p; ++j) a.ch[i][j] = g[(i - j + p) % p];
for (int i = 0; i < p; ++i) b.ch[i][0] = g[i];
c = mul(q_pow(a, n - 1), b);
ans -= c.ch[0][0];
ans = (ans % mod + mod) % mod;
printf("%d",ans);
return 0;
}
/*
3 5 3
*/

[Sdoi2017]序列计数 矩阵优化dp的更多相关文章

  1. [BZOJ 4818/LuoguP3702][SDOI2017] 序列计数 (矩阵加速DP)

    题面: 传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=4818 Solution 看到这道题,我们不妨先考虑一下20分怎么搞 想到暴力,本蒟 ...

  2. Luogu3702 SDOI2017 序列计数 矩阵DP

    传送门 不考虑质数的条件,可以考虑到一个很明显的$DP:$设$f_{i,j}$表示选$i$个数,和$mod\ p=j$的方案数,显然是可以矩阵优化$DP$的. 而且转移矩阵是循环矩阵,所以可以只用第一 ...

  3. [Sdoi2017]序列计数 [矩阵快速幂]

    [Sdoi2017]序列计数 题意:长为\(n \le 10^9\)由不超过\(m \le 2 \cdot 10^7\)的正整数构成的和为\(t\le 100\)的倍数且至少有一个质数的序列个数 总- ...

  4. 【BZOJ4818】【SDOI2017】序列计数 [矩阵乘法][DP]

    序列计数 Time Limit: 30 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description Alice想要得到一个长度为n的序 ...

  5. bzoj 4818: [Sdoi2017]序列计数【容斥原理+dp+矩阵乘法】

    被空间卡的好惨啊---- 参考:http://blog.csdn.net/coldef/article/details/70305596 容斥,\( ans=ans_{没有限制}-ans{没有质数} ...

  6. 【bzoj4818】[Sdoi2017]序列计数 矩阵乘法

    原文地址:http://www.cnblogs.com/GXZlegend/p/6825132.html 题目描述 Alice想要得到一个长度为n的序列,序列中的数都是不超过m的正整数,而且这n个数的 ...

  7. BZOJ 4818 [Sdoi2017]序列计数 ——矩阵乘法

    发现转移矩阵是一个循环矩阵. 然后循环矩阵乘以循环矩阵还是循环矩阵. 据说还有FFT并且更优的做法. 之后再看吧 #include <map> #include <cmath> ...

  8. luogu 3702 [SDOI2017]序列计数 矩阵乘法+容斥

    现在看来这道题真的不难啊~ 正着求不好求,那就反着求:答案=总-全不是质数 这里有一个细节要特判:1不是质数,所以在算全不是质数的时候要特判1 code: #include <bits/stdc ...

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

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

随机推荐

  1. Python全栈-day12-day13-函数4

    1.迭代器 1)定义:迭代取值的工具 2)优缺点 优点 a.提供一种不依赖索引取值的方法 b.同时一时刻内存在存在的值只有一个,更加省内存 缺点 a.取值麻烦,只能通过next方法一个一个地往后取 b ...

  2. “编程利器”:VSCode

    原先一直使用sublime text3,并且认为它是很好的编程利器. 但最近写代码时,发现很多代码还是提示的不够完整.我们知道,当代码名字很长时,还没有提醒,这是非常苦恼的一件事!同时它的调试功能也不 ...

  3. keras tensorboard的使用

    http://blog.csdn.net/xiaojiajia007/article/details/72865764 https://stackoverflow.com/questions/4211 ...

  4. sql privot 实现行转列

    表结构如下: RefID    HRMS    Name    InsuranceMoney    InsuranceNamefb2bdee8-e4c9-4470-8e7f-14550d3212f7  ...

  5. 转:[你必须知道的异步编程]——异步编程模型(APM)

    本专题概要: 引言 你知道APM吗? 你想知道如何使用异步编程模型编写代码吗? 使用委托也可以实现异步编程,你知道否? 小结 一.引言 在前面的C#基础知识系列中介绍了从C#1.0——C#4.0中一些 ...

  6. 利用PHP将图片转换成base64编码的实现方法

    先来说一下为什么我们要对图片base64编码 base64是当前网络上最为常见的传输8Bit字节代码的编码方式其中之一.base64主要不是加密,它主要的用途是把某些二进制数转成普通字符用于网络传输. ...

  7. subwoofer

    外文名:subwoofer 中文名:重低音音箱 俗    称:低音炮 归    类:音乐器材别    称:重低音音箱 低音炮是大家的一个俗称或者简称,严格讲应该是:重低音音箱.重低音其实是电子音乐里, ...

  8. いろはちゃんとマス目 / Iroha and a Grid (组合数学)

    题目链接:http://abc042.contest.atcoder.jp/tasks/arc058_b Time limit : 2sec / Memory limit : 256MB Score ...

  9. [转载]Java中的String,StringBuilder,StringBuffer三者的区别

    最近在学习Java的时候,遇到了这样一个问题,就是String,StringBuilder以及StringBuffer这三个类之间有什么区别呢,自己从网上搜索了一些资料,有所了解了之后在这里整理一下, ...

  10. RTMP HLS HTTP 直播协议一次看个够

    直播从2016年一路火到了2017年,如今要在自己的App里加入直播功能,只要找一个现成的SDK就行了,什么拍摄.美颜.推流,一条龙服务.不过作为直播身后最重要的部分:推流协议,很多人并不是很清楚.如 ...