sdoi<序列计数>
链接:https://www.luogu.org/problemnew/show/P3702
题解:
碰到计数题都要想想容斥
就跟碰到最大值最小要想想二分一样
考虑没有一个数是质数
那就确定了每一个数的取值范围
那么dp方程很显然
然后构造矩阵来优化转移
可以发现每个决策时一样的 所以矩阵可以一列一列的复制
#include <bits/stdc++.h>
#pragma comment(linker,"/STACK:102400000,102400000")
#pragma G++ optimize (“O2”)
using namespace std;
#define ll long long
const ll maxn= 2e7+;
#define mo 20170408
ll k,n,m;
bool f[maxn+];
struct re{
ll jz1[][],jz2[][];
}a;
re tmp,c;
re XX(re x,re y)
{
memset(tmp.jz1,,sizeof(tmp.jz1));
memset(tmp.jz2,,sizeof(tmp.jz2));
for (ll i=;i<k;i++)
for (ll j=;j<k;j++)
for (ll p=;p<k;p++)
{
tmp.jz1[i][p]=(tmp.jz1[i][p]+x.jz1[i][j]*y.jz1[j][p])%mo;
tmp.jz2[i][p]=(tmp.jz2[i][p]+x.jz2[i][j]*y.jz2[j][p])%mo;
}
return(tmp);
}
re fastpow(ll x)
{
cout<<x<<endl;
if (x==) return(a);
c=fastpow(x/);
c=XX(c,c);
if (x%) c=XX(c,a);
return c;
}
int main()
{
freopen("noip.in","r",stdin);
freopen("noip.out","w",stdout);
cin>>n>>m>>k;
memset(f,,sizeof(f));
f[]=f[]=;
for (ll i=;i<=maxn;i++)
if (f[i])
{
ll j=;
while (j*i<=maxn)
{
f[j*i]=; j++;
}
}
for (ll i=;i<=m;i++)
if (!f[i])
{
a.jz1[((-i%k)+k)%k][]++;
}
for (ll i=;i<k;i++)
{
for (ll j=;j<k;j++)
a.jz1[j][i]=a.jz1[j-][i-];
a.jz1[][i]=a.jz1[k-][i-];
}
for (ll i=;i<=m;i++)
a.jz2[((-i%k)+k)%k][]++;
for (ll i=;i<k;i++)
{
for (ll j=;j<k;j++)
a.jz2[j][i]=a.jz2[j-][i-];
a.jz2[][i]=a.jz2[k-][i-];
}
re d=fastpow(n);
cout<<(d.jz2[][]-d.jz1[][]+mo)%mo;
return ;
}
sdoi<序列计数>的更多相关文章
- BZOJ4818 序列计数
4818: [Sdoi2017]序列计数 Time Limit: 30 Sec Memory Limit: 128 MB Description Alice想要得到一个长度为n的序列,序列中的数都是 ...
- [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的方案数,矩阵快速幂即可. 另一种方法 ...
- 【BZOJ4818】[Sdoi2017]序列计数 DP+矩阵乘法
[BZOJ4818][Sdoi2017]序列计数 Description Alice想要得到一个长度为n的序列,序列中的数都是不超过m的正整数,而且这n个数的和是p的倍数.Alice还希望 ,这n个数 ...
- BZOJ4818 LOJ2002 SDOI2017 序列计数 【矩阵快速幂优化DP】*
BZOJ4818 LOJ2002 SDOI2017 序列计数 Description Alice想要得到一个长度为n的序列,序列中的数都是不超过m的正整数,而且这n个数的和是p的倍数. Alice还希 ...
随机推荐
- Jupyter 魔术命令(magic commands)
自动重新加载更改的模块 命令参数如下所示: %autoreload: 自动重载%aimport排除的模块之外的所有模块. %autoreload 0: 禁用自动重载 %autoreload 1: 自动 ...
- Linux命令(十)打包压缩、软件安装
- java中常用的包及作用
1. java.awt:提供了绘图和图像类,主要用于编写GUI程序,包括按钮.标签等常用组件以及相应的事件类. 2. java.lang:java的语言包,是核心包,默认导入到用户程序,包中有obje ...
- 如何使用Ajax从FastReport Web API获取报表
在文章“如何在ASP.NET Web API中使用FastReport.Net”中,我们已经讨论了如何创建一个用于生成报表的Web服务.然后我们会收到报表的链接,现在我们来看看如何获取报表并使用a ...
- jdk学习之如何调试jdk
自从sun被oracle收购后,在oracle下载的jdk使用F5进入调试jdk的方法就不行了,这对于想看jdk的源码的小伙伴是一个暴击(oracle在编译rt.jar时去除了调试信息): 这不得不鼻 ...
- JavaScript之this,call,apply
this:被调用的上下文对象: apply与call:切换被调用的上下文对象,即 调用时,this被临时性地切换 //demo 1 [call] function forEach(list,callb ...
- mvc,mvp.mvvm模型
这些指的是框架模式,框架模式不是一门写代码的学问,而是一门管理与组织代码的学问.其本质是一种软件开发的模型. 与设计模式不同,设计模式是在解决一类问题时总结抽象出的公共方法(工厂模式,适配器模式,单例 ...
- python Twisted安装报错
系统 mac pro 错误信息: IOError: [Errno 63] File name too long: '/var/folders/72/byjy11cs0dj_z3rjtxnj_nn000 ...
- 超图(Hypergraph)
原文地址:http://blog.csdn.net/qrlhl/article/details/48413117 超图(Hypergraph)是什么 简单的来说,对于我们熟悉的图而言,它的一个边(ed ...
- 转载:Linux操作系统(1.3.1)《深入理解Nginx》(陶辉)
原文:https://book.2cto.com/201304/19611.html 1.3 准备工作 由于Linux具有免费.使用广泛.商业支持越来越完善等特点,本书将主要针对Linux上运行的Ng ...