[SDOI 2017] 序列计数
[题目链接]
https://www.lydsy.com/JudgeOnline/problem.php?id=4818
[算法]
考虑容斥 , 用有至少有一个质数的合法序列数 - 没有质数的合法序列数
这两个问题是等价的 , 为方便讨论 , 我们考虑前者该如何计算 :
用fi , j表示前i个数 , 模p余j的合法序列数
显然有fi , j = sigma{ fi - 1 , j - k }
矩阵优化即可
时间复杂度 : O(M + logN)
[代码]
#include<bits/stdc++.h>
using namespace std; #ifndef LOCAL
#define eprintf(...) fprintf(stderr , _VA_ARGS)
#else
#define eprintf(...) 42
#endif typedef long long ll;
typedef long double ld;
typedef vector< int > vi;
typedef pair<int , int> pii;
typedef pair<ll , int> pli;
typedef pair<ll , ll> pll;
typedef unsigned long long ull;
#define mp make_pair
#define fi first
#define se second
const int N = 2e7 + ;
const int P = ; struct Tmatrix {
int mat[][];
} a; int n , m , p , tot;
int prime[N] , sa[] , sb[];
bool lab[N] , f[N]; template <typename T> inline void chkmax(T &x , T y) { x = max(x , y); }
template <typename T> inline void chkmin(T &x , T y) { x = min(x , y); }
template <typename T> inline void read(T &x) {
T f = ; x = ;
char c = getchar();
for (; !isdigit(c); c = getchar()) if (c == '-') f = -f;
for (; isdigit(c); c = getchar()) x = (x << ) + (x << ) + c - '';
x *= f;
}
inline void sieve( ) {
for (int i = ; i <= m; ++i) {
if (!f[i]) {
prime[++tot] = i;
lab[i] = true;
}
for (int j = ; j <= tot; ++j) {
int tmp = i * prime[j];
if (tmp > m) break;
f[tmp] = true;
if (i % prime[j] == ) break;
}
}
}
inline int sub(int x , int y) {
x -= y;
while (x < ) x += P;
return x;
}
inline void multipy(Tmatrix &a , Tmatrix b) {
Tmatrix c;
for (int i = ; i < p; ++i) {
for (int j = ; j < p; ++j) {
c.mat[i][j] = ;
}
}
for (int i = ; i < p; ++i) {
for (int j = ; j < p; ++j) {
for (int k = ; k < p; ++k) {
c.mat[i][j] = (c.mat[i][j] + 1ll * a.mat[i][k] * b.mat[k][j] % P) % P;
}
}
}
for (int i = ; i < p; ++i) {
for (int j = ; j < p; ++j) {
a.mat[i][j] = c.mat[i][j];
}
}
}
inline void qpow(Tmatrix &a , int n) {
Tmatrix b , res;
for (int i = ; i < p; ++i) {
for (int j = ; j < p; ++j) {
res.mat[i][j] = (i == j);
b.mat[i][j] = a.mat[i][j];
}
}
while (n > ) {
if (n & ) multipy(res , b);
multipy(b , b);
n >>= ;
}
for (int i = ; i < p; ++i) {
for (int j = ; j < p; ++j) {
a.mat[i][j] = res.mat[i][j];
}
}
}
inline int calc(int n , int type) {
for (int i = ; i < p; ++i) {
for (int j = ; j < p; ++j) {
int k = (i - j + p) % p;
a.mat[i][j] = type == ? sa[k] : sb[k];
}
}
qpow(a , n);
return a.mat[][];
} int main() { read(n); read(m); read(p);
sieve( );
for (int i = ; i <= m; ++i) {
sa[i % p] = (sa[i % p] + ) % P;
if (!lab[i]) sb[i % p] = (sb[i % p] + ) % P;
}
printf("%d\n" , sub(calc(n , ) , calc(n , ))); return ;
}
[SDOI 2017] 序列计数的更多相关文章
- [BZOJ 4818] [SDOI 2017] 序列计数
Description Alice想要得到一个长度为 \(n\) 的序列,序列中的数都是不超过 \(m\) 的正整数,而且这 \(n\) 个数的和是 \(p\) 的倍数. Alice还希望,这 \(n ...
- BZOJ4818 序列计数
4818: [Sdoi2017]序列计数 Time Limit: 30 Sec Memory Limit: 128 MB Description Alice想要得到一个长度为n的序列,序列中的数都是 ...
- [BZOJ4818][SDOI2017]序列计数(动规+快速幂)
4818: [Sdoi2017]序列计数 Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 972 Solved: 581[Submit][Status ...
- [Sdoi2017]序列计数 [矩阵快速幂]
[Sdoi2017]序列计数 题意:长为\(n \le 10^9\)由不超过\(m \le 2 \cdot 10^7\)的正整数构成的和为\(t\le 100\)的倍数且至少有一个质数的序列个数 总- ...
- BZOJ_4818_[Sdoi2017]序列计数_矩阵乘法
BZOJ_4818_[Sdoi2017]序列计数_矩阵乘法 Description Alice想要得到一个长度为n的序列,序列中的数都是不超过m的正整数,而且这n个数的和是p的倍数.Alice还希望 ...
- HDU 6348 序列计数 (树状数组 + DP)
序列计数 Time Limit: 4500/4000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total Subm ...
- luogu3702-[SDOI2017]序列计数
Description Alice想要得到一个长度为nn的序列,序列中的数都是不超过mm的正整数,而且这nn个数的和是pp的倍数. Alice还希望,这nn个数中,至少有一个数是质数. Alice想知 ...
- 【BZOJ 4818】 4818: [Sdoi2017]序列计数 (矩阵乘法、容斥计数)
4818: [Sdoi2017]序列计数 Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 560 Solved: 359 Description Al ...
- P3702 [SDOI2017]序列计数
P3702 [SDOI2017]序列计数 链接 分析: 首先可以容斥掉,用总的减去一个质数也没有的. 然后可以dp了,f[i][j]表示到第i个数,和在模p下是j的方案数,矩阵快速幂即可. 另一种方法 ...
随机推荐
- 关于angularjs的model的一些问题
有的时候 在一些页面中 我们会需要用到弹出的模态框,这里主要是使用angularjs的uimodel. 页面效果如下: 首先我们需要在JS的controller中导入$uibModal模块. HTML ...
- 4 Values whose Sum is 0(二分)
4 Values whose Sum is 0 Time Limit: 15000MS Memory Limit: 228000K Total Submissions: 21370 Accep ...
- android菜鸟学习笔记18----Android数据存储(二)SharedPreferences
数据存储的方式,有比直接文件读写更加简便的方式,那就是操作SharedPreferences. SharedPreferences一般用于存储用户的偏好设定,暂时不支持多进程操作. SharedPre ...
- 九度OJ 1344:可乐瓶展览 (DP)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:430 解决:76 题目描述: 众所周知JOBDU旗下的JOBCOLA公司是文明全球的著名可乐制造商,与其它可乐公司不同的是,JOBCOLA可 ...
- EventLoop(netty源码死磕4)
精进篇:netty源码 死磕4-EventLoop的鬼斧神工 目录 1. EventLoop的鬼斧神工 2. 初识 EventLoop 3. Reactor模式回顾 3.1. Reactor模式的组 ...
- vue表单输入的绑定
vue的核心:声明式的指令和数据的双向绑定. 那么声明式的指令,已经给大家介绍完了.接下来我们来研究一下什么是数据的双向绑定? 另外,大家一定要知道vue的设计模式:MVVM M是Model的简写,V ...
- PAT 1061. 判断题(15)
判断题的评判很简单,本题就要求你写个简单的程序帮助老师判题并统计学生们判断题的得分. 输入格式: 输入在第一行给出两个不超过100的正整数N和M,分别是学生人数和判断题数量.第二行给出M个不超过5的正 ...
- PAT 1057. 数零壹(20)
给定一串长度不超过105的字符串,本题要求你将其中所有英文字母的序号(字母a-z对应序号1-26,不分大小写)相加,得到整数N,然后再分析一下N的二进制表示中有多少0.多少1.例如给定字符串“PAT ...
- 遇到IIS configuration error错误的可以看看,不一定是权限问题
最近接手了别人的一个 DOT NET项目,编译.调试一切都OK(心里暗暗高兴),发布吧,结果放到服务器上一运行出现Configuration Error错误,提示:“Access to the pat ...
- Java中的 && 与&
Java中&&和&都是表示与的逻辑运算符,都表示逻辑运输符and,当两边的表达式都为true的时候,整个运算结果才为true,否则为false. &&的短路功能 ...