ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

#矩阵乘法#洛谷 3702 [SDOI2017]序列计数

2021-10-19 21:35:18  阅读:188  来源: 互联网

标签:洛谷 rr int A0 SDOI2017 3702 mul 100 mod


题目链接


分析

考虑容斥,用总方案减去全是合数的方案数,
可以发现 \(n\) 很大,\(p\) 很小,直接用矩阵乘法转移即可


代码

#include <cstdio>
#include <cctype>
#include <algorithm>
#define rr register
using namespace std;
const int mod=20170408; bool v[mod];
struct maix{int p[100][100];}A0,A1,ANS0,ANS1;
int n,m,k,prime[1300011],Cnt,c0[100],c1[100];
inline signed iut(){
	rr int ans=0; rr char c=getchar();
	while (!isdigit(c)) c=getchar();
	while (isdigit(c)) ans=(ans<<3)+(ans<<1)+(c^48),c=getchar();
	return ans;
}
inline signed mo(int x,int y){return x+y>=mod?x+y-mod:x+y;}
inline void mul(maix &A,maix B){
	rr maix C;
    for (rr int i=0;i<k;++i)
	for (rr int j=0;j<k;++j){
    	C.p[i][j]=0;
    	for (rr int o=0;o<k;++o)
    	    C.p[i][j]=mo(C.p[i][j],1ll*A.p[i][o]*B.p[o][j]%mod);
	}
	for (rr int i=0;i<k;++i)
	for (rr int j=0;j<k;++j)
	    A.p[i][j]=C.p[i][j];
}
signed main(){
	scanf("%d%d%d",&n,&m,&k),v[1]=1;
	for (rr int i=2;i<=m;++i){
		if (!v[i]) prime[++Cnt]=i;
		for (rr int j=1;j<=Cnt&&prime[j]<=m/i;++j){
			v[i*prime[j]]=1;
			if (i%prime[j]==0) break;
		}
	}
	for (rr int i=1;i<=m;++i) ++c0[i%k];
	for (rr int i=1;i<=m;++i) if (v[i]) ++c1[i%k];
	for (rr int i=0;i<k;++i)
	for (rr int j=0;j<k;++j)
	    A0.p[i][(i+j)%k]=c0[j],A1.p[i][(i+j)%k]=c1[j];
	ANS0.p[0][0]=ANS1.p[0][0]=1;
	for (;n;n>>=1,mul(A0,A0),mul(A1,A1))
	    if (n&1) mul(ANS0,A0),mul(ANS1,A1);
	return !printf("%d",mo(ANS0.p[0][0],mod-ANS1.p[0][0]));
}

标签:洛谷,rr,int,A0,SDOI2017,3702,mul,100,mod
来源: https://www.cnblogs.com/Spare-No-Effort/p/15426495.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有