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的序 ...
随机推荐
- IT界程序员几大恶习能立即让你变穷,你有吗?
IT软件开发,确实是各行业中薪水排名靠前的职业,月薪在八千以上的Java程序员多不胜数,但是不知有没有以下几种恶习?如果粘上一种,哪怕你薪水几万,估计最后也是囊中羞涩:综上所述列举以下几点,亲们自己对 ...
- HDU - 5457 Hold Your Hand (Trie + 最小割)
Hold Your Hand Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 65535/102400 K (Java/Others)T ...
- CF Gym 100187D Holidays (数学,递推)
题意:给n个元素,从n中选两个非空集合A和B.问有多少中选法? 递推: dp[n]表示元素个数为n的方案数,对于新来的一个元素,要么加入集合,要么不加入集合自成一个集合.加入集合有三种选择,A,B,E ...
- Ajax获取服务器响应头部信息
$.ajax({ type: 'HEAD', // 获取头信息,type=HEAD即可 url : window.location.href, complete: function( xhr,data ...
- 导入文件 服务器报错,有可能是 开发时候是window 服务器是linux,两个系统的文件系统的/和\是相反的,要注意这块
导入文件 服务器报错,有可能是 开发时候是window 服务器是linux,两个系统的文件系统的/和\是相反的,要注意这块
- 使用MaskedTextBox控件实现输入验证
实现效果: 知识运用: MaskedTextBox控件的 Mask属性 BeepOnError属性 MaskInputRejected事件 实现代码: private void Form1_Load( ...
- javaweb基础(14)_jsp的原理
一.什么是JSP? JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术. JSP这门技术的最大的特点在于,写jsp就像在写h ...
- linux 使用wget下载https连接地址cannot verify github.com's certificate
使用linux的wget下载时候会出现网站没有证书警告的问题, 例如下载git时,可以使用wget https://github.com/git/git/archive/v2.3.0.zip --no ...
- pandas实践——美国人口分析
1.导入文件,并查看数据样本 abbr = pd.read_csv("./state-abbrevs.csv")areas =pd.read_csv("./state-a ...
- Python爬虫系列-Urllib库详解
Urllib库详解 Python内置的Http请求库: * urllib.request 请求模块 * urllib.error 异常处理模块 * urllib.parse url解析模块 * url ...