求调,100分优化成20分
查看原帖
求调,100分优化成20分
525375
Richard_Whr楼主2023/11/4 20:51
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=510,M=1<<9;
int primes[8]={2,3,5,7,11,13,17,19};
struct node
{
    int w;
    int P,B=-1;
    bool operator<(const node &t)const
    {
        return w<t.w;
    }
    inline void init()
    {
        for(int i=0;i<8;i++) 
        {
            while(w%primes[i]==0) P=P|(1<<i),w/=primes[i];
        }
        if(w>1)B=w;
    }
}num[N];
int f[M][M];
int g1[M][M];
int g2[M][M];
int n,mod;

signed main()
{
    scanf("%lld%lld",&n,&mod);
    for(int i=1;i<n;i++) num[i].w=i+1,num[i].init();
    sort(num+1,num+n);
    
    f[0][0]=1;
    int i;
    for(i=1;i<n&&num[i].B==-1;i++)
    {
        int S=num[i].P;
        for(int s1=(1<<8)-1;s1>=0;s1--)
        {
            int s=((1<<8)-1)^s1;
            for(int s2=s;s2>=1;s2=(s2-1)&s)
            {
                if(!(S&s2)) f[s1|S][s2]=(f[s1|S][s2]+f[s1][s2])%mod;
                if(!(S&s1)) f[s1][s2|S]=(f[s1][s2|S]+f[s1][s2])%mod;
            }
            int s2=0;
            if(!(S&s2)) f[s1|S][s2]=(f[s1|S][s2]+f[s1][s2])%mod;
            if(!(S&s1)) f[s1][s2|S]=(f[s1][s2|S]+f[s1][s2])%mod;
        }
    }
    
    for(;i<n;i++)
    {
        if(num[i].B!=num[i-1].B) memcpy(g1,f,sizeof f),memcpy(g2,f,sizeof f);
        int S=num[i].P;
        for(int s1=(1<<8)-1;s1>=1;s1--)
        {
            int s=((1<<8)-1)^s1;
            for(int s2=s;s2>=1;s2=(s2-1)&s)
            {
                if(!(S&s2)) g1[s1|S][s2]=(g1[s1|S][s2]+g1[s1][s2])%mod;
                if(!(S&s1)) g2[s1][s2|S]=(g2[s1][s2|S]+g2[s1][s2])%mod;
            }
            int s2=0;
            if(!(S&s2)) g1[s1|S][s2]=(g1[s1|S][s2]+g1[s1][s2])%mod;
            if(!(S&s1)) g2[s1][s2|S]=(g2[s1][s2|S]+g2[s1][s2])%mod;
        }
        if(num[i].B!=num[i+1].B||i==n-1)
        {
            for(int s1=(1<<8)-1;s1>=0;s1--)
            {
                int s=((1<<8)-1)^s1;
                for(int s2=s;s2>=1;s2=(s2-1)&s)
                {
                    f[s1][s2]=((g1[s1][s2]+g2[s1][s2])%mod-f[s1][s2]+mod)%mod;
                }
                int s2=0;
                f[s1][s2]=((g1[s1][s2]+g2[s1][s2])%mod-f[s1][s2]+mod)%mod;
            }
        }
    }
    int ans=0;
    for(int s1=(1<<8)-1;s1>=0;s1--)
    {
        int s=((1<<8)-1)^s1;
        for(int s2=s;s2>=1;s2=(s2-1)&s)
        {
            ans=(ans+f[s1][s2])%mod;
        }
        int s2=0;
        ans=(ans+f[s1][s2])%mod;
    }
    
    printf("%lld",ans);
    
    return 0;
}
2023/11/4 20:51
加载中...