题面

首先这 \(n\) 个数是互相独立的,所以我们不需要统一的去考虑,只需要考虑其中一个数即可。

我们以 \(k=5\) 的情况举例。

我设 \(f_i\) 为最后一行只填前 \(i\) 个点的情况数, \(g_i\) 为 \(k=i\) 时总共的情况数。

显然, \(f_0\) 就是 \(g_{k-1}\) ,在这里就是 \(g_4\) 。



然后 \(f_1\) 其实就是图中黑色部分一定填,白色一定不填,红色部分可选的种类数。进一步观察,这个红色部分其实就是 \(g_3\) 。





再进一步由图可以得到, \(f_2=g_2,f_3=g_1\) 。

再往下, \(f_4\) 和 \(f_5\) 都没得选了,所以 \(f_4=f_5=1\) 。

为了下面讲述方便,我们设 \(f_4=g_0=1\) 。

那么我们已经得到了 \(g_5=\sum^5_{i=1}f_i\) ,那么我们可以推广到其他数,可知 \(g_k=\sum^k_{i=1}f_i\)

再进一步观察,当 \(k=5\) 时, \(f_0=g_4,f_1=g_3,f_2=g_2,f_3=g_1,f_4=g_0\) ,

所以 \(g_5=\sum^5_{i=1}f_i=\sum^4_{i=1}g_{4-i}+f_5=\sum^4_{i=1}g_i+1\) 。

推广到其他数,可知 \(g_k=\sum^{k-1}_{i=1}g_i+1\)

那么我们可以根据 \(g_0=1\) 推出 \(g_1=2,g_2=4,g_3=8\) 。

观察规律,可以发现 \(g_i=2^i\) 。

如何证明呢?我们使用数学归纳法。

首先当 \(i=0\) 时,\(g_0=1=2^0\) ,结论成立。

再假设 \(i=k\) 时,结论已成立,那么 \(g_{k+1}=\sum^{k}_{i=1}g_i+1=\sum^{k-1}_{i=1}g_i+1+g_k\) ,而 \(\sum^{k-1}_{i=1}g_i+1=g_k\) ,所以 \(g_{k+1}=\sum^{k-1}_{i=1}g_i+1+g_k=2\times g_k=2\times 2^k=2^{k+1}\) ,所以 \(i=k+1\) 时仍然成立。

所以我们就证明出了 \(g_i=2^i\) 。

回到最开始。我们有 \(n\) 个数,每个数有 \(g_k=2^k\) 种选择,那么根据乘法原理,总计的选择数就是 \(2^{nk}\) 。用快速幂算一下即可。代码就不贴了。

最新文章

  1. htmlnav
  2. 基于 Redis 数据累计的实现
  3. spring注解方式 idea报could not autowire,eclipse却没有问题
  4. iOS 发布应用时屏蔽NSLog
  5. 2017-5-31 VBA设置config sheet 制作工具
  6. JavaScript 第一课
  7. (五)超级猜图Demo引出的细节
  8. linux下查看动态链接库so文件的依赖的相关组建
  9. C++实现 电子邮件客户端程序(简易版)
  10. PCL法线估计
  11. ASP.NETAutocomplete control
  12. [VBScript] 自动删除2小时以前生成的文件
  13. Centos 7 安装Zabbix
  14. 【Unity笔记】UGUI物体的渲染顺序
  15. CCFlow工作流程起航
  16. 查看嵌入式设备的CPU频率
  17. 第三方库RATreeView的使用记录
  18. 线程同步工具 Semaphore类的基础使用
  19. Struts1之bean标签
  20. 时间服务器: NTP 服务器及客户端搭建

热门文章

  1. WebAPI中controller添加[AllowAnonymous]无效的解决方法
  2. 【java虚拟机】类加载机制
  3. C# 串口开发
  4. LeetCoded第242题题解--java--数组
  5. 在PyQt中构建 Python 菜单栏、菜单和工具栏
  6. Oracle环境配置之山路十八弯
  7. 详细解读go语言中的chnanel
  8. Jenkins(8)- CentOS 7.x 通过yum安装jenkins
  9. Intel® QAT加速卡之同步异步模式
  10. 如果还是看不懂container_of()函数,那算我输