社区讨论

第三个样例不对,输出64974764

P2150[NOI2015] 寿司晚宴参与者 1已保存回复 1

讨论操作

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

当前回复
1 条
当前快照
1 份
快照标识符
@m03v41kw
此快照首次捕获于
2024/08/21 21:01
去年
此快照最后确认于
2024/08/22 08:54
去年
查看原帖
而且代码微调答案变化很大
CPP
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<string>
#include<cstdlib>
#include<iomanip>
using namespace std;
long long n,mod,ans;
long long p[]={2,3,5,7,11,13,17,19};
long long dp[350][550],f1[350][350],f2[350][350];
struct ss{
	long long id,sp,bigp;
}a[550];
bool cmp(ss a,ss b){
	return a.bigp<b.bigp;
}
int main(){
	cin>>n>>mod;
	for(int i=2;i<=n;i++){
		int x=i;
		a[i].id=i;
		for(int k=0;k<8;k++){
			if(x%p[k]==0){
				while(x%p[k]==0){
					x/=p[k];
				}
				a[i].sp|=(1<<k);
			}
		}
		a[i].bigp=x;
	}
	sort(a+2,a+n+1,cmp);
	dp[0][0]=1;
	for(int k=2;k<=n;k++){
		if(a[k].bigp!=a[k-1].bigp||a[k].bigp==1){
			memcpy(f1,dp,sizeof(f1));
			memcpy(f2,dp,sizeof(f2));
		}
		for(int i=255;i>=0;i--){
			for(int j=255;j>=0;j--){
				if((i&j)==0){
					if((a[k].sp&i)==0){
						f2[i][j|a[k].sp]+=f2[i][j]%mod;
						f2[i][j|a[k].sp]%=mod;
					}
					if((a[k].sp&j)==0){
						f1[i|a[k].sp][j]+=f1[i][j]%mod;
						f1[i|a[k].sp][j]%=mod;
					}
				}
			}
		}
		if(a[k].bigp!=a[k+1].bigp||a[k].bigp==1){
			for(int i=255;i>=0;i--){
				for(int j=255;j>=0;j--){
					if((i&j)==0){
						dp[i][j]=((f1[i][j]+f2[i][j])%mod+mod-dp[i][j])%mod;
						/*if(k==n){
							ans+=dp[i][j];
							ans%=mod;
						}*/
					}
				}
			}
		}
	}
	for(int i=0;i<=255;i++){
		for(int j=0;j<=255;j++){
			ans+=dp[i][j];
			ans%=mod; 
		}
		//cout<<endl;
	}
	cout<<ans;
	return 0; 
}

回复

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

正在加载回复...