这紫题太水了,建议降绿
查看原帖
这紫题太水了,建议降绿
1807054
tianjianshuji楼主2025/7/21 15:33

题面这么清晰,第一眼想到模拟,对于每个寿司有三种状态,枚举复杂度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;
}

但是不知道为什么错了几个点,求调

2025/7/21 15:33
加载中...