题解
2026-08-31 20:28:45
发布于:辽宁
9阅读
0回复
0点赞
A92036.「NOI2015」寿司晚宴
省选/NOI-
#include<bits/stdc++.h>
using namespace std;
long long n,mod,f1[256][256],f2[256][256],dp[256][256],ans;
int prime[10]={2,3,5,7,11,13,17,19};
struct node
{
int st;
int lft;
}a[505];
bool cmp(node x,node y)
{
return x.lft<y.lft;
}
int main()
{
cin>>n>>mod;
for(int i=1;i<n;i++)
{
int x=i+1;
a[i].lft=-1;
for(int j=0;j<8;j++)
{
if(x%prime[j]==0)
{
a[i].st|=1<<j;
while(x%prime[j]==0)x/=prime[j];
}
}
if(x!=1)a[i].lft=x;
}
sort(a+1,a+n,cmp);
dp[0][0]=1;
for(int i=1;i<n;i++)
{
if(i==1 || a[i].lft!=a[i-1].lft || a[i].lft==-1)
{
memcpy(f1,dp,sizeof(f1));
memcpy(f2,dp,sizeof(f2));
}
for(int j=255;j>=0;j--)
{
for(int k=255;k>=0;k--)
{
if(j&k)continue;
if((a[i].st&k)==0)f1[a[i].st|j][k]=(f1[a[i].st|j][k]+f1[j][k])%mod;
if((a[i].st&j)==0)f2[j][a[i].st|k]=(f2[j][a[i].st|k]+f2[j][k])%mod;
}
}
// cout<<a[i].st<<" ";
if(i==n-1 || a[i].lft!=a[i+1].lft || a[i].lft==-1)
{
for(int j=255;j>=0;j--)
{
for(int k=255;k>=0;k--)
{
if(j&k)continue;
dp[j][k]=(f1[j][k]+f2[j][k]-dp[j][k]+mod)%mod;
}
}
}
}
for(int i=0;i<=255;i++)
{
for(int j=0;j<=255;j++)
{
if(i&j)continue;
ans=(ans+dp[i][j])%mod;
}
}
cout<<ans;
return 0;
}
全部评论 1
能给个赞么
2026-09-06 来自 辽宁
0







有帮助,赞一个