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;
    }
  • 相关阅读:
    js获取 DOM 里所有图片(包括背景和iframe)
    php 和 js互相调用
    mac 权限
    node 启动命令
    three.js THREE.MeshLine.js 回显3D路径
    Vue2, Vue3 开发单一html页面区别
    前端布局,相关链接
    jq国际化jquery.i18n.properties使用
    资料
    其它工具
  • 原文地址:https://www.cnblogs.com/AKCqhzdy/p/9878787.html
Copyright © 2011-2022 走看看