社区讨论
第三个样例不对,输出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 条回复,欢迎继续交流。
正在加载回复...