Luogu3702 SDOI2017 序列计数 矩阵DP
传送门
不考虑质数的条件,可以考虑到一个很明显的$DP:$设$f_{i,j}$表示选$i$个数,和$mod\ p=j$的方案数,显然是可以矩阵优化$DP$的。
而且转移矩阵是循环矩阵,所以可以只用第一行的数字代替整个矩阵。当然了这道题$p \leq 100$矩阵比较小也可以直接做。
然后考虑至少要一个质数的条件,发现就是所有数参与$DP$的答案减去所有合数参与$DP$的答案,两次算出来相减即可。
1 #include<bits/stdc++.h> 2 #define ll long long 3 //This code is written by Itst 4 using namespace std; 5 6 inline int read(){ 7 int a = 0; 8 char c = getchar(); 9 bool f = 0; 10 while(!isdigit(c)){ 11 if(c == '-') 12 f = 1; 13 c = getchar(); 14 } 15 while(isdigit(c)){ 16 a = (a << 3) + (a << 1) + (c ^ '0'); 17 c = getchar(); 18 } 19 return f ? -a : a; 20 } 21 22 const int MOD = 20170408; 23 int N , M , P , ans; 24 bool nprime[(int)2e7 + 10]; 25 struct matrix{ 26 ll a[110]; 27 matrix(){memset(a , 0 , sizeof(a));} 28 inline ll& operator [](int x){return a[x];} 29 matrix operator *(matrix b){ 30 matrix c; 31 for(int i = 0 ; i < P ; ++i) 32 for(int j = 0 ; j < P ; ++j) 33 c[i] += a[j] * b[i - j < 0 ? i - j + P : i - j]; 34 for(int j = 0 ; j < P ; ++j) 35 c[j] %= MOD; 36 return c; 37 } 38 }S , T , G; 39 40 int main(){ 41 #ifndef ONLINE_JUDGE 42 freopen("in" , "r" , stdin); 43 //freopen("out" , "w" , stdout); 44 #endif 45 N = read(); 46 M = read(); 47 P = read(); 48 for(int i = 0 ; i < P && i <= M ; ++i) 49 G[i % P] = (M - i) / P + (bool)i; 50 S[0] = 1; 51 T = G; 52 int K = N; 53 while(K){ 54 if(K & 1) 55 S = S * T; 56 T = T * T; 57 K >>= 1; 58 } 59 ans = S[0]; 60 for(int i = 2 ; i <= M ; ++i) 61 if(!nprime[i]){ 62 --G[i % P]; 63 for(int j = i ; j <= M / i ; ++j) 64 nprime[i * j] = 1; 65 } 66 T = G; 67 S = matrix(); 68 S[0] = 1; 69 K = N; 70 while(K){ 71 if(K & 1) 72 S = S * T; 73 T = T * T; 74 K >>= 1; 75 } 76 cout << (ans - S[0] + MOD) % MOD; 77 return 0; 78 }
转载于:https://www.cnblogs.com/Itst/p/10165342.html
Luogu3702 SDOI2017 序列计数 矩阵DP相关推荐
- bzoj 4818: [Sdoi2017]序列计数(DP+矩阵快速幂)
4818: [Sdoi2017]序列计数 Time Limit: 30 Sec Memory Limit: 128 MB Submit: 769 Solved: 463 [Submit][Stat ...
- 【BZOJ4818】【SDOI2017】序列计数 [矩阵乘法][DP]
序列计数 Time Limit: 30 Sec Memory Limit: 128 MB [Submit][Status][Discuss] Description Alice想要得到一个长度为n的 ...
- 2019.02.11 bzoj4818: [Sdoi2017]序列计数(矩阵快速幂优化dp)
传送门 题意简述:问有多少长度为n的序列,序列中的数都是不超过m的正整数,而且这n个数的和是p的倍数,且其中至少有一个数是质数,答案对201704082017040820170408取模(n≤1e9, ...
- BZOJ4818 [SDOI2017] 序列计数 【矩阵快速幂】
题目分析: 一个很显然的同类项合并.注意到p的大小最大为100,考虑把模p意义下相同的求出来最后所有的减去没有质数的做矩阵快速幂即可. 代码: 1 #include<bits/stdc++.h& ...
- 序列计数(动态规划/自动机/前缀和优化)
序列计数 对于一个小写字母的序列每次可以将相邻两个不同的小写字母都变为二者之一,可以进行无限次这样的操作,求解可以产生多少种不同的序列. 首先我们不能考虑操作,而是考虑合法序列,显然最后会形成若干个区 ...
- UOJ #214 合唱队形 (概率期望计数、DP、Min-Max容斥)
UOJ #214 合唱队形 (概率期望计数.DP.Min-Max容斥) 9个月的心头大恨终于切掉了!!!! 非常好的一道题,不知为何uoj上被点了70个差评. 题目链接: http://uoj.ac/ ...
- 数数题(计数类 DP)做题记录
数数题(计数类 DP)做题记录 CF1657E Star MST 我们称张无向完全图是美丽的当且仅当:所有和 \(1\) 相连的边的边权之和等于这张完全图的最小生成树的边权之和. 完全图点数为 \(n ...
- 序列自相关矩阵的计算和分析
序列自相关矩阵的计算和分析 这几天在搞DSP的时候遇到的一些问题,稍微整理了一下 在下文中,你将会看到:平稳过程到底有什么意义.随机信号处理是如何与固定信号分析联系起来的.自相关函数的定义.自相关矩阵 ...
- 离散数学考前复习:(一)集合、整数、序列、矩阵
离散数学考前复习:(一)集合.整数.序列.矩阵 1. 1集合 元素与集合直接存在属于关系或不属于关系. 集合的表示方法:枚举法.特征法.递归法 常用集合符号: ∅:空集 N:自然数集合 Z:整数集合 ...
最新文章
- 路由器配置实践 教你如何在Linux中三台主机两个网段互相通信
- JavaScript学习记录 (三) 函数和对象
- cisco路由器基本命令配置
- Python入门100题 | 第043题
- 【收藏】华为路由器交换机配置命令大全
- 赢得市值,失去人心,美团觉得划算吗?
- 地图 c-suite_C-Suite的模型
- 最简单的图形用户代码_简单几句代码,画出精美的图形,快跟着学起来~
- 如何自学python知乎-你们都是怎么学 Python 的?
- python的第三方库是干什么用的-Python 常用的标准库以及第三方库有哪些?
- 哔哩哔哩---WPF入门基础教程(合集)
- [行业报告] 芒果发布8月份国内移动广告平台数据报告
- 支持大规模视频融合的混合现实技术
- 企业如何做好服务器防护45.113.201.1
- 为什么我说低代码是“行业毒瘤”?
- 微信小程序vue+nodejs+uniapp家装 装修装饰公司管理系统
- VMware教程(二):CentOS 7 网络配置
- 【MySQL练习】数据查询(02)-简易版
- 详解网络爬虫:网络爬虫是干什么的?有哪些应用场景?
- 交换机开发(一)—— 交换机的工作原理
热门文章
- python实现软件的注册功能(机器码+注册码机制)
- Linux命令学习手册-tr命令 2015-07-26 20:35 9人阅读 评论(0) 收藏...
- 转 Android的Activity屏幕切换动画(一)-左右滑动切换
- C++单元测试框架的比较(zz)
- openshift for linux
- 《活出生命的意义》:人生有何意义?
- Python操作MongoDB - 极简教程
- Laravel数据库迁移和填充(支持中文)
- H3C交换机 汇聚接口上应用策略路由
- 用习惯了windows系统要怎样去认识linux系统(一)