zoukankan      html  css  js  c++  java
  • bzoj4347: [POI2016]Nim z utrudnieniem

    垃圾卡常卡空间题毁我青春

    这题先转化一下,变成取一些数的异或和为所有数的异或和的方案数

    然后这明显是个背包

    然而O(nmd)过不去啊,这里一个优化,就是给a[i]排序,那么能够影响的范围只能到a[i]的最高位

    由于d的那一维是%d循环的,直接背包就会有锅,又开不下滚动数组,就只能特殊处理%d==0的情况了

    还有那个m是废的啊,因为你a[i]<=1000000所以你的异或和肯定不大于2^20

    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<cstdlib>
    #include<algorithm>
    #include<cmath>
    using namespace std;
    const int mod=1e9+7;
    
    int a[1100000];
    int f[10][1100000],g[1100000];
    int main()
    {
        int n,d,sum=0;
        scanf("%d%d",&n,&d);
        for(int i=1;i<=n;i++)
            scanf("%d",&a[i]),sum^=a[i];
        sort(a+1,a+n+1);
        
        f[0][0]=1;int u=1;
        for(int i=1;i<=n;i++)
        {
            while(u<=a[i])u*=2;
            for(int j=0;j<u;j++)
            {
                g[j]=f[d-1][j^a[i]]+f[0][j];
                if(g[j]>mod)g[j]-=mod;
            }
            for(int k=d-1;k>=1;k--)
                for(int j=0;j<u;j++)
                {
                    f[k][j]=f[k][j]+f[k-1][j^a[i]];
                    if(f[k][j]>mod)f[k][j]-=mod;
                }
            for(int j=0;j<u;j++)f[0][j]=g[j];
        }
        if(n%d==0)f[0][sum]--;
        if(f[0][sum]<0)f[0][sum]+=mod;
        printf("%d
    ",f[0][sum]);
        return 0;
    }
  • 相关阅读:
    Python-枚举
    Python-函数
    Python-装饰器(语法糖)上下五千年和前世今生
    Python-全局函数(内置方法、内置函数)
    Python-时间模块-time
    Python-随机模块-random
    Python-维护排序好的序列模块-bisect
    需求推动技术的产生
    RBF神经网络
    聚类算法的衡量指标
  • 原文地址:https://www.cnblogs.com/AKCqhzdy/p/9878787.html
Copyright © 2011-2022 走看看