正题

题目链接:https://www.luogu.com.cn/problem/P3702


题目大意

nnn个不超过mmm的正整数,要求和是ppp的倍数且至少有一个质数。


解题思路

用总方案数减去只有非质数的方案数即可。

线性筛出所有质数,然后矩阵乘法转移即可。

时间复杂度O(m+p3log⁡n)O(m+p^3\log n)O(m+p3logn)


codecodecode

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll S=100,P=20170408;
struct matrix{ll a[S][S];
}f,c,ans,a;
ll n,m,p,cnt,pri[5000000];
bool v[20000001];
matrix operator*(matrix &a,matrix &b){memset(c.a,0,sizeof(c.a));for(ll i=0;i<p;i++)for(ll j=0;j<p;j++)for(ll k=0;k<p;k++)(c.a[i][j]+=a.a[i][k]*b.a[k][j]%P)%=P;return c;
}
ll power(ll x,ll b){ll ans=1;while(b){if(b&1)ans=ans*x%P;x=x*x%P;b>>=1;}return ans;
}
int main()
{scanf("%lld%lld%lld",&n,&m,&p);for(ll i=2;i<=m;i++){if(!v[i])pri[++cnt]=i;for(ll j=1;j<=cnt&&i*pri[j]<=m;j++){v[i*pri[j]]=1;if(i%pri[j]==0)break;}}for(ll i=0;i<p;i++){for(ll j=0;j<p;j++)(f.a[i][(i+j)%p]+=m/p+((m%p)>=j))%=P;f.a[i][i]--;}ll b=n;a=f;ans.a[0][0]=1;while(b){if(b&1)ans=ans*a;a=a*a;b>>=1;} b=n;ll tmp=ans.a[0][0];memset(ans.a[0],0,sizeof(ans.a[0]));ans.a[0][0]=1;for(ll i=0;i<p;i++)for(ll j=1;j<=cnt;j++)(f.a[i][(i+pri[j])%p]+=P-1)%=P;a=f;while(b){if(b&1)ans=ans*a;a=a*a;b>>=1;} printf("%lld",(tmp-ans.a[0][0]+P)%P);return 0;
}

P3702-[SDOI2017]序列计数【矩阵乘法】相关推荐

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

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

  2. Luogu3702 SDOI2017 序列计数 矩阵DP

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

  3. bzoj 4818: [Sdoi2017]序列计数(DP+矩阵快速幂)

    4818: [Sdoi2017]序列计数 Time Limit: 30 Sec  Memory Limit: 128 MB Submit: 769  Solved: 463 [Submit][Stat ...

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

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

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

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

  6. hdu2371 矩阵乘法(求序列位置改变m次后的序列)

    题意:       给你一个字符串,然后让你执行m次操作,每次操作把当前的字符串映射到他给你的位置序列的位置,比如给的是 3 1 2,第一步就是把原来的3的位置的字母变到1的位置,1的变到2的位置,2 ...

  7. 【矩阵乘法】生成树计数(luogu 2109/NOI 2007)

    生成树计数 luogu 2109 题目大意 有n个排成一列的点,把距离不超过k的点之间连边,问这个图的生成树个数 输入样例 3 5 输出样例 75 样例说明 样例对应的图如下: 数据范围 解题思路 因 ...

  8. Ybtoj-排列计数【矩阵乘法,分块幂】

    正题 题目链接:http://noip.ybtoj.com.cn/contest/596/problem/1 题目大意 TTT组询问给出nnn求有多少个nnn的排列满足第一个是111并且相邻的差不超过 ...

  9. BZOJ 4180: 字符串计数 后缀自动机 + 矩阵乘法 + 二分(神题)

    Description SD有一名神犇叫做Oxer,他觉得字符串的题目都太水了,于是便出了一道题来虐蒟蒻yts1999. 他给出了一个字符串T,字符串T中有且仅有4种字符 'A', 'B', 'C', ...

最新文章

  1. 华人小哥开发“黑话”数据集,AI:你连dbq都不知道,xswl!| NAACL 2021
  2. c#中volatile关键字的作用
  3. java如何使实验箱蜂鸣器响_按键按一次蜂鸣器响一次的单片机程序
  4. cad lisp 两侧偏移并删除_弱电CAD不算CAD?学学操作,将手速发挥极致,让他人刮目相看...
  5. 计算机d都学啥,信息学奥数基础知识D计算机的基本组成
  6. ARouter源码探究
  7. 算法 判断多个点是否在同一圆周线上_凸包问题——礼物包裹算法
  8. 各行业2021薪酬报告来了,三大高薪行业令人羡慕
  9. flowable画图教程_JeeGit企业级快速开发平台-JeeSite4 Flowable入门教程
  10. Ubuntu安装Vim编辑器
  11. 在ubuntu安装使用miniconda
  12. java连不上mysql_eclipse连接不上mysql
  13. Unicode编码在JavaScript中的作用是什么?
  14. 使用虚拟机备份软件备份云宏Winghong CNware虚拟机
  15. excel 2003 VBA编程入门教程
  16. class文件反编译后的汉字乱码问题
  17. 国中假期 part 1
  18. 机器学习:线性模型-多重共线性问题的解决-岭回归
  19. 愤怒的小鸟 高清完整版下载
  20. 三维重建方法--激光or视觉

热门文章

  1. linux挂载4t硬盘用不了,centos7挂载新加4T硬盘到/home目录
  2. 超时锁定计算机,就会发现多了一个控制台锁定显示关闭超时选项
  3. python反射、闭包、装饰器_python之闭包、装饰器、生成器、反射
  4. 7-43 字符串关键字的散列映射 (25 分)(思路+详解+不懂的兄弟们来呀)兄弟们我干了5个小时,一个一个测试点过的
  5. 「软件项目管理」一文了解软件项目团队计划
  6. [MyBatisPlus]模拟多数据源环境及测试
  7. [SpringBoot2]文件上传_单文件与多文件上传的使用
  8. [Java基础]字符流中的编码解码问题
  9. [剑指offer]面试题45:圆圈中最后剩下的数字
  10. Factory Method(工厂方法)--对象创建型模式