JZOJ 4058. 【JSOI2015】子集选取
2017-02-11 20:48
253 查看
Description
Input
Output
Sample Input
输入1:
2 2输入2:
6 40Sample Output
输出1:
16输出2:
401898087Data Constraint
Solution
设 f(n,k) 为输入为 n,k 的答案。由于对于每一个元素,选取过程都是独立的,
即元素 i 不会影响元素 j 的选取
那么可以得到 f(n,k)=f(1,k)n 。
下面来推导 f(1,k) 。单个元素的选取的特点是:
选取 1 的位置是连续的,并会形成阶梯状。
如下图:(当 k=6的情况:深色的是被选取的部分)
设 Ai 为第 i 列最后选取的行是什么。若从第 1 列到第 m 列均存在格子被选取,
那么将满足:Ai+1≤Ai(1≤i≤m)
设 Gi,j 表示在第 i 列最后选取的是第 j 行的方案数,那么得到递推式:Gi,j=∑p=jkGi−1,p
观察可得:Gi,j=Gi−1,j+Gi,j+1
推导一下会发现这是组合数的形式!
由于元素可以一个也不选,也可以在任意位置结束,所以:f(1,k)=1+∑Gi,j=2k
综合可得:f(n,k)=2n∗k
则时间复杂度为 O(logn) !
Code
#include<cstdio> using namespace std; const int mo=1e9+7; int n,k; inline long long ksm(long long x,int y) { long long s=1; while(y) { if(y&1) s=s*x%mo; x=x*x%mo; y>>=1; } return s; } int main() { scanf("%d%d",&n,&k); printf("%lld",ksm(ksm(2,k),n)); return 0; }
相关文章推荐
- 【JSOI2015】【JZOJ 4058】子集选取
- Json转换利器Gson之实例五-实际开发中的特殊需求处理
- JavaScript中创建对象方法总结
- Json转换利器Gson之实例四-Map处理(下)
- Json转换利器Gson之实例三-Map处理(上)
- 学习JavaScript中的异步Generator
- express框架下index.js和index.ejs的注释版
- JavaScript --- 事件处理
- JavaScript 变量作用域、this、闭包
- 跟小博老师一起学Servlet ——Servlet生命周期
- JavaScript练习之添加纪录(简洁方法)
- JavaScript全局对象
- JavaScript练习之添加纪录
- JavaScript练习之删除记录
- js高级程序设计笔记--Ajax与comet
- js高级程序设计笔记--Ajax与comet
- Json转换利器Gson之实例一-简单对象转化和带泛型的List转化
- JavaScript练习之全选反选练习
- ajax提交的javascript代码
- JavaScript基础技巧44