• 4197: [Noi2015]寿司晚宴


    状压dp。

    500分解质因数的话,除了最大的质因数只需要8个质数,用二进制x储存,最大的质因数用y来储存(若没有比那8个质数大的质因数就使y=1)

    用f[i][j]表示第一个人方案为i,第二个人方案为j时的方案数。

    递推时用p[0/1][i][j]表示第1/2个人选当前数,i和j分别为两人方案时的方案数。

    有f[i][j]=(p[0][i][j]+p[1][i][j]-f[i][j])%mod。 因为p数组都选了当前数,导致之前的方案计算两遍。

    转移方程很好懂。

    //quick
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    using namespace std;
    const int maxn = 300 + 10;
    const int d[]={2,3,5,7,11,13,17,19};
    int f[maxn][maxn];
    int p[3][maxn][maxn];
    int n,mod,res;
    struct data {
        int x,y;
    }a[600];
    
    bool cmp(data a,data b) {
        return a.y<b.y || (a.y==b.y && a.x<b.x);    
    }
    
    inline void build() {
        for(int i=2,t;i<=n;i++) {
            t=i;
            for(int j=0;j<8;j++) if(t%d[j]==0) {
                a[i].x=a[i].x|(1<<j);
                while(t%d[j]==0) t/=d[j];
                if(t==1) break;
            }
            a[i].y=t;
        }
    }
    
    int main() {
        scanf("%d%d",&n,&mod);
        build();    
        sort(a+2,a+n+1,cmp);
        f[0][0]=1;
        for(int i=2;i<=n;i++) {
            if(a[i].y==1 || a[i].y!=a[i-1].y) {
                memcpy(p[1],f,sizeof(f));
                memcpy(p[2],f,sizeof(f));
            }
            for(int j=255;j>=0;j--)
            for(int k=255;k>=0;k--) if((j&k)==0) {
                if((k&a[i].x)==0) p[1][j|a[i].x][k]=(p[1][j|a[i].x][k]+p[1][j][k])%mod;
                if((j&a[i].x)==0) p[2][j][k|a[i].x]=(p[2][j][k|a[i].x]+p[2][j][k])%mod;     
            }
            if(a[i].y==1||i==n||a[i].y!=a[i+1].y) {
                for(int j=0;j<=255;j++)
                for(int k=0;k<=255;k++) if((j&k)==0) 
                    f[j][k]=(((p[1][j][k]+p[2][j][k]-f[j][k])%mod)+mod)%mod;
            }
        }
        for(int i=0;i<=255;i++)
        for(int j=0;j<=255;j++) 
        res=(res+f[i][j])%mod;
        
        printf("%d
    ",res);
        return 0;
    }
  • 相关阅读:
    find
    fdisk
    falcon-eye
    ethtools
    e2fsck
    dpkg
    declare
    df
    debconf-utils
    区块链从零开始做开发(0):hyperledger Fabric2.3安装
  • 原文地址:https://www.cnblogs.com/invoid/p/5649852.html
Copyright © 2020-2023  润新知