话说这题放在智推里好久了的说,再不写掉对不起自己233

首先你要知道一个叫做阶梯Nim的东西,具体的可以看这篇博客

那么我们发现这和这道题的关系就很明显了,我们把两个金币之间的距离看作阶梯Nim的每一堆的石子个数

考虑阶梯Nim的结论:奇数编号堆的石子异或和为\(0\),发现我们可以搞一个很暴力的DP出来

\(f_{i,j,k}\)表示当前放了前\(i\)堆石子,总共用了石子个数是\(j\),其中奇数堆石子的异或和为\(k\)的方案数,转移的时候直接枚举当前堆拿了几个即可,复杂度\(O(n^3\times m)\),显然无法通过此题

我们再来冷静一下,发现限制的条件是异或,那么果断想到从二进制的角度出发

先容斥一下,令\(f_{i,j}\)表示做了前\(i\)位的,奇数堆和为\(j\)且异或和为\(0\)的方案数,最后用隔板法综合偶数堆的情况然后用\(C_n^m\)减去即可

然后DP就很好转移了,我们从高到低枚举二进制位,然后枚举奇数堆的和,剩下枚举这一位是\(1\)的奇数堆的个数(显然必须为偶数),然后转移的时候乘上组合数即可

复杂度\(O(nm\times \log n)\),足以通过本题的数据范围。当然提一下这题还有利用进位角度考虑然后再用MTT优化的\(O(m\log m\log n)\)的优秀做法因此是可以出一个加强版的233

#include<cstdio>
#define RI register int
#define CI const int&
using namespace std;
const int N=200005,R=20,mod=1e9+9;
int n,m,f[R][N],odd,even,num,ret,fact[N],inv[N];
inline void inc(int& x,CI y)
{
if ((x+=y)>=mod) x-=mod;
}
inline int sub(CI x,CI y)
{
int t=x-y; return t<0?t+mod:t;
}
inline int quick_pow(int x,int p=mod-2,int mul=1)
{
for (;p;p>>=1,x=1LL*x*x%mod) if (p&1) mul=1LL*mul*x%mod; return mul;
}
inline void init(CI n)
{
RI i; for (fact[0]=i=1;i<=n;++i) fact[i]=1LL*fact[i-1]*i%mod;
for (inv[n]=quick_pow(fact[n]),i=n-1;~i;--i) inv[i]=1LL*inv[i+1]*(i+1)%mod;
}
inline int C(CI n,CI m)
{
return 1LL*fact[n]*inv[m]%mod*inv[n-m]%mod;
}
int main()
{
RI i,j,k; scanf("%d%d",&n,&m); init(n+m);
for (odd=m+1>>1,even=m+1-odd,num=n-m,f[R-1][num]=1,i=R-2;~i;--i)
for (j=0;j<=num;++j) for (k=0;j+(1<<i)*k<=num&&k<=odd;k+=2)
inc(f[i][j],1LL*f[i+1][j+(1<<i)*k]*C(odd,k)%mod);
for (i=0;i<=num;++i) inc(ret,1LL*f[0][i]*C(i+even-1,even-1)%mod);
return printf("%d",sub(C(n,m),ret)),0;
}

最新文章

  1. Android 的Parcelable接口
  2. iOS 商品倒计时 限时特价 限时优惠 功能的封装
  3. C++类成员布局
  4. C# 多重overide
  5. Markdown 语法说明
  6. JavaWeb学习之JSP常用标签、EL表达式的运算符、JSTL标签库(6)
  7. Good Bye 2013 C
  8. Jackson 框架,轻易转换JSON
  9. Saving HDU
  10. linux网卡速率和双工模式的配置
  11. [原]Unity3D深入浅出 - 雾效(Fog)
  12. linux文件属性详解
  13. android 01
  14. String类中几个简单的常用方法
  15. tomcat之负载均衡(apache反响代理tomcat)
  16. Linux设置某软件开机自动启动的方法
  17. 关于ajax post请求跨域问题的解决心得
  18. [0] CollectionBase与索引符DictionaryBase与迭代器
  19. Linux 命令 及 简单操作 学习
  20. Deep Learning Terminologies

热门文章

  1. HDUNumber Sequence(KMP)
  2. 【51nod1678】lyk与gcd(莫比乌斯反演+枚举因数)
  3. 第04组&#160;Alpha冲刺(1/4)
  4. node 下载 md5.js
  5. JVM基础详解
  6. 为什么不允许使用 Java 静态构造函数?
  7. json递归查询
  8. ASP.NET 数据绑定
  9. Python-警告处理
  10. Java 比较器