题面

出现了,神仙题!

了解一点博弈论的话可以很容易转化题面:问$B$有多少种取(diu)石子的方式使得取后剩余石子异或值为零且取出的石子堆数是$d$的倍数

首先有个暴力做法:$dp[i][j][k]$表示到第$i$个为止取出来的石子数目模$d$等于$j$且剩下的石子异或和为$k$的方案数,然后就枚举转移啊=。=

发现时空复杂度好像都不能承受,不过可以尝试分析/优化一下。首先分析一波后发现时间复杂度其实是对的......只是我们需要将石子数从小到大排个序,这样一路异或下来异或到$i$时最大值不超过$2*a[i]$,复杂度是$O(dm)$的

然后根据POI的传统我们还不能滚动数组,需要卡空间......那就抓个临时数组记录一下算了=。=

 #include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=,K=,mod=1e9+;
int sto[N],mem[N],dp[K][N];
int n,d,ans,goal,maxx;
int main ()
{
scanf("%d%d",&n,&d);
for(int i=;i<=n;i++)
scanf("%d",&sto[i]),goal^=sto[i];
sort(sto+,sto+n+),dp[][]=;
for(int i=;i<=n;i++)
{
while(maxx<=sto[i]) maxx=maxx<<|;
for(int j=;j<=maxx;j++)
mem[j]=(dp[][j]+dp[d-][j^sto[i]])%mod;
for(int j=d-;j;j--)
for(int k=;k<=maxx;k++)
dp[j][k]+=dp[j-][k^sto[i]],dp[j][k]%=mod;
for(int j=;j<=maxx;j++) dp[][j]=mem[j];
}
ans=(dp[][goal]-(n%d==)+mod)%mod;
printf("%d",ans);
return ;
}

解题:POI 2016 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. 设$f[i][j][k]$表示考虑了前$i$堆的石子,当前扔掉的堆数模$d$为$j$,没有扔掉的石子的异或和为$k$的方案数. 因为石子排过序,所以转移的复杂度为$O( ...

  3. [POI2016]Nim z utrudnieniem

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

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

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

  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. yd的拔钉子之路之 POI 2017

    写在前面的一些话 如果我NOIP没退役,这大概会写成一个系列吧,所以这算是系列的开始,要写一些奇怪的东西? 首先解释下什么叫“拔钉子”,其实就是在钉子上做题嘛......至于钉子具体是个什么东西就当面 ...

  8. leetcode第6题:Z字形变换--直接模拟求解法

    [题目描述] 将一个给定字符串根据给定的行数,以从上往下.从左到右进行 Z 字形排列. 比如输入字符串为 "LEETCODEISHIRING" 行数为 3 时,排列如下: 之后,你 ...

  9. LeetCode解题Golang(1-10)

    前言 LeetCode题目个人答案(Golang版) 本篇预期记录 1-10 题, 持续更新 正文 1.两数之和(简单) https://leetcode-cn.com/problems/two-su ...

随机推荐

  1. centos7挂载Windows共享文件夹(学习笔记)

    centos7挂载windows共享文件夹 练习环境:centos7是安装在台式机的虚拟机,Windows共享文件夹是公司服务器的共享文件夹(已设置好的共享) 步骤 1. 设置挂载点:mkdir /m ...

  2. cinder创建volume的流程-简单梳理

    1. cinder-api接收到创建的请求,入口:cinder.api.v2.volumes.VolumeController#create,该方法主要负责一些参数的重新封装和校验,然后调用cinde ...

  3. 从无到有之webpack+vuerouter的简单例子以及各个属性解释

    之前一直没玩过webpack和vue,近两周才看这玩意,本文纯属自己的实验+之前angular作战经验的理解一些入门文章 首先webpack关于vue以及各个包 module.exports = { ...

  4. java面向对象的冒泡排序,选择排序和插入排序的比较

    这三种排序有俩个过程: 1.比较俩个数据. 2.交换俩个数据或复制其中一项. 这三种排序的时间级别 冒泡排序:比较 (N-1)+(N-2)+...+2+1 = N*(N-1)/2=N2/2 交换  0 ...

  5. 4. 基本socket函数

    一.创建socket /* 创建一个socket */ int socket(int family, int type, int protocol); /* 参数说明 */ // domain:使用哪 ...

  6. 附加题程序找bug

    private: void Resize(int sz){ ){ return; } if(maxSize != sz){ T *arr = new T[sz]; if(arr == NULL){ r ...

  7. Thunder-Beta发布中间产物-2017秋-软件工程第十次作业

    Thunder-Beta发布中间产物(WBS&PSP) WBS: 分解方式:按照「爱阅」阅读器的实施过程分解 使用工具:visio 2013 PSP: PSP 实际时间 Planning 计划 ...

  8. CS小分队第一阶段冲刺站立会议(5月11日)

    昨日成果:完成了倒计时器的制作,为其添加了声音:并对扫雷游戏的失败添加了动态效果: 遇到的困难:把图片放入picturebox中无法改变图片的大小,音乐格式只能使用.wav,该格式音乐比较大,增加了整 ...

  9. python 动态获取当前运行的类名和函数名的方法

    一.使用内置方法和修饰器方法获取类名.函数名 python中获取函数名的情况分为内部.外部,从外部的情况好获取,使用指向函数的对象,然后用__name__属性 复制代码代码如下: def a():pa ...

  10. 软件定义网络(SDN)研究进展

    写在前面 这是我入门SDN以来的第一篇论文,它是一篇中文综述,看起来相对容易.也让我对SDN有了进一步的认识.下面是我的一些心得. 全文框架 SDN 将数据平面与控制平面解耦合,简化了网络管理. SD ...