题面这么清晰,第一眼想到模拟,对于每个寿司有三种状态,枚举复杂度O(3n),每个状态两重循环检查,复杂度O(2n),所以总时间复杂度O(5n),随便过n=500的数据,我一个OI的新手都会
#include<iostream>
#include<vector>
using namespace std;
int gcd(int a,int b)
{
if(b==0) return a;
return gcd(b,a%b);
}
int main()
{
int n,p;
cin>>n>>p;
int m=n-1;
if(n==1)
{
cout<<1%p<<endl;
return 0;
}
int tot=1;
for(int i=0;i<m;i++)
{
tot*= 3;
}
int ans=0;
for(long long s=0;s<tot;s++)
{
vector<int>G,W;
long long temp=s;
for(int i=0;i<m;i++)
{
int d=temp%3;
temp/=3;
int v=i+2;
if(d==1)
{
G.push_back(v);
}
else if(d==2)
{
W.push_back(v);
}
}
if(G.empty()||W.empty())
{
ans=(ans+1)%p;
continue;
}
bool valid=true;
for(int i=0;i<G.size();i++)
{
for(int j=0;j<W.size();j++)
{
if(gcd(G[i],W[j])!=1)
{
valid=false;
break;
}
}
if(!valid) break;
}
if(valid)
{
ans=(ans + 1) % p;
}
}
cout<<ans<<endl;
return 0;
}
但是不知道为什么错了几个点,求调