BZOJ 4818 [Sdoi2017]序列计数 ——矩阵乘法
发现转移矩阵是一个循环矩阵。
然后循环矩阵乘以循环矩阵还是循环矩阵。
据说还有FFT并且更优的做法。
之后再看吧
#include <map>
#include <cmath>
#include <queue>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define F(i,j,k) for (int i=j;i<=k;++i)
#define D(i,j,k) for (int i=j;i>=k;--i)
#define ll long long
#define mp make_pair
#define md 20170408
#define maxn 20000005 int pri[maxn],top,p,n,m;
bool vis[maxn];
int cnt[2][101];//0 质数 1 非质数 void init()
{
memset(vis,false,sizeof vis);
cnt[0][1]++;cnt[1][1]++;
F(i,2,m)
{
if (!vis[i]) pri[++top]=i,cnt[0][i%p]++;
else cnt[0][i%p]++,cnt[1][i%p]++;
for (int j=1;j<=top&&(ll)i*pri[j]<=m;++j)
{
vis[i*pri[j]]=true;
if (i%pri[j]==0) break;
}
}
} struct Matrix{
int x[101][101];
void init(){memset(x,0,sizeof x);}
void build1()
{
init();
F(i,0,p-1) F(j,0,p-1)
(x[i][(i+j)%p]+=cnt[1][j])%=md;
}
void builde()
{
init();
F(i,0,p-1) x[i][i]=1;
}
void build0()
{
init();
F(i,0,p-1) F(j,0,p-1)
(x[i][(i+j)%p]+=cnt[0][j])%=md;
}
Matrix operator * (Matrix a) {
Matrix ret;
ret.init();
F(i,0,p-1) F(j,0,p-1) F(k,0,p-1)
(ret.x[i][j]+=x[i][k]*a.x[k][j])%=md;
return ret;
}
Matrix operator ^ (Matrix a){
Matrix ret;
ret.init();
F(j,0,p-1) F(k,0,p-1)
ret.x[0][j]=((ll)ret.x[0][j]+(ll)x[0][k]*a.x[k][j])%md;
F(i,1,p-1)
{
ret.x[i][0]=ret.x[i-1][p-1];
F(j,1,p-1) ret.x[i][j]=ret.x[i-1][j-1];
}
return ret;
}
void print()
{
printf("|----------|\n");
F(i,0,p-1)
{
F(j,0,p-1)
printf("%d ",x[i][j]);
printf("\n");
}
printf("|----------|\n");
}
}A,B,S,C,D; int main()
{
scanf("%d%d%d",&n,&m,&p); init();
S.init();S.x[0][0]=1;
int b=n,ans=0;
A.build0(); C.builde();
while (b)
{
if (b&1) C=C^A;
A=A^A;
b>>=1;
}
ans+=C.x[0][0];
A.build1(); C.builde(); b=n;
while (b)
{
if (b&1) C=C^A;
A=A^A;
b>>=1;
}
ans-=C.x[0][0];
printf("%d\n",(ans%md+md)%md);
}
BZOJ 4818 [Sdoi2017]序列计数 ——矩阵乘法的更多相关文章
- bzoj 4818: [Sdoi2017]序列计数【容斥原理+dp+矩阵乘法】
被空间卡的好惨啊---- 参考:http://blog.csdn.net/coldef/article/details/70305596 容斥,\( ans=ans_{没有限制}-ans{没有质数} ...
- 【bzoj4818】[Sdoi2017]序列计数 矩阵乘法
原文地址:http://www.cnblogs.com/GXZlegend/p/6825132.html 题目描述 Alice想要得到一个长度为n的序列,序列中的数都是不超过m的正整数,而且这n个数的 ...
- BZOJ.4818.[SDOI2017]序列计数(DP 快速幂)
BZOJ 洛谷 竟然水过了一道SDOI!(虽然就是很水...) 首先暴力DP,\(f[i][j][0/1]\)表示当前是第\(i\)个数,所有数的和模\(P\)为\(j\),有没有出现过质数的方案数. ...
- BZOJ 4818 SDOI2017 序列计数
刚出炉的省选题,还是山东的. 自古山东出数学和网络流,堪称思维的殿堂,比某地数据结构成风好多了. 废话不说上题解. 1.题面 求:n个数(顺序可更改),值域为[1,m],和为p的倍数,且这些数里面有质 ...
- luogu 3702 [SDOI2017]序列计数 矩阵乘法+容斥
现在看来这道题真的不难啊~ 正着求不好求,那就反着求:答案=总-全不是质数 这里有一个细节要特判:1不是质数,所以在算全不是质数的时候要特判1 code: #include <bits/stdc ...
- 【BZOJ 4818】 4818: [Sdoi2017]序列计数 (矩阵乘法、容斥计数)
4818: [Sdoi2017]序列计数 Time Limit: 30 Sec Memory Limit: 128 MBSubmit: 560 Solved: 359 Description Al ...
- [BZOJ 4818/LuoguP3702][SDOI2017] 序列计数 (矩阵加速DP)
题面: 传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=4818 Solution 看到这道题,我们不妨先考虑一下20分怎么搞 想到暴力,本蒟 ...
- [Sdoi2017]序列计数 [矩阵快速幂]
[Sdoi2017]序列计数 题意:长为\(n \le 10^9\)由不超过\(m \le 2 \cdot 10^7\)的正整数构成的和为\(t\le 100\)的倍数且至少有一个质数的序列个数 总- ...
- 【BZOJ4818】【SDOI2017】序列计数 [矩阵乘法][DP]
序列计数 Time Limit: 30 Sec Memory Limit: 128 MB[Submit][Status][Discuss] Description Alice想要得到一个长度为n的序 ...
随机推荐
- UVA 1616 Caravan Robbers 商队抢劫者(二分)
x越大越难满足条件,二分,每次贪心的选区间判断是否合法.此题精度要求很高需要用long double,结果要输出分数,那么就枚举一下分母,然后求出分子,在判断一下和原来的数的误差. #include& ...
- GIT分布式版本控制器的前后今生
Git的入门与安装 GIT基础操作 GIT的分支应用 GITLAB应用 gitlab与pycharm应用 GITHUB使用
- EditPlus 3.7激活码注册码
EditPlus3.7激活教程以及EditPlus3.7激活码使用方法 EditPlus是一款功能齐全的文字编辑器,搭配其他的插件还可以实现很多的功能,还可以编辑和编译Java,调试程序等,主要用来打 ...
- Lemonade Trade
4990: Lemonade Trade 时间限制: 1 Sec 内存限制: 128 MB Special Judge提交: 88 解决: 17[提交][状态][讨论版][命题人:admin] ...
- cityspace
类别的网址:https://blog.csdn.net/u010069760/article/details/77847595 r,g,b: 250 170 160 parking 244 35 ...
- jquery的正则表达式
正则表达式 位置: ^ 开头 $ 结尾 次数: * 0或多个 + 1或多个 ? 0或1个 {n} 就是n个 {n,} 至少n个 {n,m} ...
- 2d游戏中的射线与矩形检测碰撞
cc.exports.LineCollideRect(startLine,endLine,rect)--向量与矩形检测碰撞 --获取矩形的四个顶点位置 local p = {cc.p(rect.x,r ...
- redis学习笔记(1)
最近在学习redis,做了比较详细的学习笔记,分享给大家,欢迎一起讨论和学习 第一部分,简单介绍redis 和 redis的基本操作 NoSQL的特点 : 数据库种类繁多,但是一个共同的特点都是去掉关 ...
- 【php】expose_php 作用
php.ini expose_php = On expose_php = Off
- python-time模块--pickle模块
目录 time 模块 为什么要有time模块,time模块有什么用? time模块的三种格式 时间戳(timestamp) 格式化时间(需要自己定义格式) 结构化时间(struct-time) 结构化 ...