社区讨论

过了样例全WA

P3702[SDOI2017] 序列计数参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mdn2nu1d
此快照首次捕获于
2025/07/28 20:16
7 个月前
此快照最后确认于
2025/11/04 03:34
4 个月前
查看原帖
CPP
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring> 
using namespace std;
typedef long long ll;
ll n,m,p;
string a,b;
ll dp[2][150],g[2][150];
ll cnt[150],cur[150];
const ll mod=20170408;


bool pi[20000020];
ll tot,t[100010];
void prime(){
	pi[0]=pi[1]=1;
	cnt[1]=cur[1]=1;
	for(ll i=2;i<=m;i++){
		cnt[i%p]++;
		if(pi[i]){
			cur[i%p]++;
		}
		else{
			t[++tot]=i;
		}
		for(ll j=1;j<=tot;j++){
			if(t[j]*i>m){
				break;
			}
			pi[t[j]*i]=1;
			if(i%t[j]==0){
				break;
			}
		}
	}
}


struct matrix{
	int mt[150][150];
};
matrix mul(matrix a,matrix b){
	matrix c;
	for(int i=0;i<p;i++){
		for(int j=0;j<p;j++){
			for(int k=0;k<p;k++){
				c.mt[i][j]+=a.mt[i][k]*b.mt[k][j]%mod;
				c.mt[i][j]%=mod;
			}
		}
	}
	return c;
}
matrix mpow(matrix a,int p){
	if(p==1){
		return a;
	}
	matrix ans;
	if(p%2){
		ans=a;
		matrix sum=mpow(a,p/2);
		sum=mul(sum,sum);
		ans=mul(ans,sum);
	}
	else{
		ans=mpow(a,p/2);
		ans=mul(ans,ans);
	}
	return ans;
}


int main(){
	cin>>n>>m>>p;
	prime();
	matrix s,x;
	for(int i=0;i<p;i++){
		s.mt[i][0]=cnt[p-i];
		for(int j=0;j<p;j++){
			x.mt[i][j]=cnt[(p+j-i)%p];
		}
	}
	s=mul(mpow(x,n-1),s);
	matrix t=s;
	for(int i=0;i<p;i++){
		s.mt[i][0]=cur[p-i];
		for(int j=0;j<p;j++){
			x.mt[i][j]=cur[(p+j-i)%p];
		}
	}
	s=mul(mpow(x,n-1),s);
	cout<<t.mt[0][0]-s.mt[0][0];
	return 0;
} 

回复

0 条回复,欢迎继续交流。

正在加载回复...