将石子从小到大排序,然后DP。

设$f[i][j][k]$表示考虑了前$i$堆的石子,当前扔掉的堆数模$d$为$j$,没有扔掉的石子的异或和为$k$的方案数。

因为石子排过序,所以转移的复杂度为$O(md)$。

对于空间的问题,注意到$f[i][j][k]$和$f[i][j][k\ xor\ a[i]]$的转移是互补的,于是可以同时处理,省去滚动数组,直接做到原地DP,当然$f[i][0][k]$要特别处理。

最后注意特判$n$是$d$的倍数的情况,此时答案应该减去$1$。

#include<cstdio>
const int N=1048576,P=1000000007;
int n,d,m,p,i,j,k,x,a[N],f[10][N],g[N];
inline void read(int&a){char c;while(!(((c=getchar())>='0')&&(c<='9')));a=c-'0';while(((c=getchar())>='0')&&(c<='9'))(a*=10)+=c-'0';}
inline int add(int a,int b){
a+=b;
if(a>=P)a-=P;
return a;
}
int main(){
for(read(n),read(d);i<n;i++){
read(j),a[j]++;
if(j>m)m=j;
}
for(f[0][0]=i=p=1;i<=m;i++){
while(p<=i)p<<=1;
while(a[i]--){
for(k=0;k<p;k++)g[k]=add(f[d-1][k],f[0][k^i]);
for(j=d-1;j;j--)for(k=0;k<p;k++)if(k<=(k^i)){
x=f[j][k];
f[j][k]=add(f[j-1][k],f[j][k^i]);
f[j][k^i]=add(f[j-1][k^i],x);
}
for(k=0;k<p;k++)f[0][k]=g[k];
}
}
return printf("%d",add(f[0][0],P-(n%d==0))),0;
}

  

BZOJ4347 : [POI2016]Nim z utrudnieniem的更多相关文章

  1. bzoj 4347 [POI2016]Nim z utrudnieniem DP

    4347: [POI2016]Nim z utrudnieniem Time Limit: 30 Sec  Memory Limit: 64 MBSubmit: 733  Solved: 281[Su ...

  2. 【bzoj4347】[POI2016]Nim z utrudnieniem dp

    题解: 感觉我简直是个傻逼 把题目数据范围看错了.. 然后觉得这题非常的不可做 sigmaai <1e7.... 这题的dp是非常简单的,注意到d很小 f[i][j][k]表示前i个,%d为j, ...

  3. [POI2016]Nim z utrudnieniem

    Description A和B两个人玩游戏,一共有m颗石子,A把它们分成了n堆,每堆石子数分别为a[1],a[2],...,a[n],每轮可以选择一堆石子,取掉任意颗石子,但不能不取.谁先不能操作,谁 ...

  4. 解题:POI 2016 Nim z utrudnieniem

    题面 出现了,神仙题! 了解一点博弈论的话可以很容易转化题面:问$B$有多少种取(diu)石子的方式使得取后剩余石子异或值为零且取出的石子堆数是$d$的倍数 首先有个暴力做法:$dp[i][j][k] ...

  5. BZOJ4347 POI2016Nim z utrudnieniem(博弈+动态规划)

    由nim游戏的结论,显然等价于去掉一些数使剩下的数异或和为0. 暴力的dp比较显然,设f[i][j][k]为前i堆移走j堆(模意义下)后异或和为k的方案数.注意到总石子数量不超过1e7,按ai从小到大 ...

  6. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  7. 【Python】使用torrentParser1.03对多文件torrent的分析结果

    Your environment has been set up for using Node.js 8.5.0 (x64) and npm. C:\Users\horn1>cd C:\User ...

  8. Nim语言的模块化编程

    前言 Nim支持把一大段程序分成若干个模块 一个模块就是一个源代码文件 每个模块都拥有它自己的名称空间 模块化可以起到封装(信息隐藏)和分步编译的作用 一个模块可以通过import语句获得另一个模块的 ...

  9. Nim教程【十二】

    排除指定符号 一般情况下使用import语句,会把一个模块内的符号都导入进来 如果你像排除特定的符号(不想让某些符号被导入进来) 可以使用except子句 就像下面这样 import mymodule ...

随机推荐

  1. 解决Yum安装依赖问题

    导读 最近在网上看到很多关于安装网络Yum源是报错的求助,本小白也曾遇到过此类问题,后找过度娘没有有效的解决办法.最后,经过几番尝试后终于解决,现在将解决方案共享给大家! Yum源及安装 安装过程在之 ...

  2. 对原型prototype的详解

    刚开始接触对象原型时大脑就开始起义了,脑子就转不灵清了.就感觉怎么着这个概念就是灌输不进去,俗称断路.后面找了很多资料,最主要的还是要借助于<JavaScript语言精髓>这本书,让我对这 ...

  3. c# 如何使用wlanapi连接电脑到wifi

    http://www.codeproject.com/Articles/72105/Manage-WiFi-with-Native-API-WIFI-on-Windows-XP-SP Introduc ...

  4. MySQL关闭过程详解和安全关闭MySQL的方法

    MySQL关闭过程详解和安全关闭MySQL的方法 www.hongkevip.com 时间: -- : 阅读: 整理: 红客VIP 分享到: 红客VIP(http://www.hongkevip.co ...

  5. CSS clearfix

    The problem happens when a floated element is within a container box, that element does not automati ...

  6. 【Hadoop】史上最全 Hadoop 生态 全景图

  7. Sharepoint 2010 创建栏 计算栏

    SharePoint 创建栏时,可以添加计算字段, 网上查了查,相关资料如下: http://wenku.baidu.com/view/936239e9b8f67c1cfad6b88f.html ht ...

  8. javascript输出AscII码扩展集中的字符

    function test(){ var c=""; for(var i=1;i<65536;i++){ if((i%10)==0){ c+=i+':\t'+String.f ...

  9. C++基础(1)

    1.关于继承及访问. C++中 public,protected, private 访问标号小结,即访问标号使用限制. 第一:private, public, protected 访问标号的访问范围. ...

  10. mysql 超级管理员

    mysql> grant all privileges on *.* to 'master'@'%' identified by '3306' with grant option; Query ...