hihocoder #1076:与链
2016-04-28 11:26
218 查看
题目描述:http://hihocoder.com/problemset/problem/1076
看了题没有一点思路,然后就搜到了这篇blog:/article/2457165.html
也是看了好久,好在最后搞明白了
关键的一点就是:假如这k个数的二进制每个数最多有i位,那么如果每个数有i+1位的话,这k个数的第i+1位可以有0,1,2…k个是1,其余是0,并且第1+1位是1的数在前面,然后就可以用数位dp了,dp[i][j]表示k个数每个最多到i位(从0位开始),和为j有多少种情况,由于n<10000,故枚举到dp[13](2^13=8192)就可以了
看了题没有一点思路,然后就搜到了这篇blog:/article/2457165.html
也是看了好久,好在最后搞明白了
关键的一点就是:假如这k个数的二进制每个数最多有i位,那么如果每个数有i+1位的话,这k个数的第i+1位可以有0,1,2…k个是1,其余是0,并且第1+1位是1的数在前面,然后就可以用数位dp了,dp[i][j]表示k个数每个最多到i位(从0位开始),和为j有多少种情况,由于n<10000,故枚举到dp[13](2^13=8192)就可以了
#include <stdio.h> #include <string.h> #define MOD 1000000009 #define MAX_N 10000 long long dp[14][MAX_N+1]; int min(int a, int b){ return a < b ? a : b; } int main(){ int t, i, j, h, n, k; scanf("%d", &t); while(t--){ scanf("%d%d", &k, &n); memset(dp, 0, sizeof(dp)); j = n < k ? n :k; for(i = 0; i <= j; i++){ dp[0][i] = 1; } for(i = 1; i < 14; i++){ for(j = 0; j <= n; j++){ for(h = 0; h <= k && j-(h<<i) >= 0; h++){ dp[i][j] += dp[i-1][j-(h<<i)]; dp[i][j] %= MOD; } } } printf("%lld\n", dp[13] ); } return 0; }
相关文章推荐
- 以Apache服务器、php语言为例 详解动态网站的访问过程
- [转] UIWebView与JS的深度交互
- HDU 5001 Walk (概率DP)
- Android Studio一些常用快捷键及快捷键冲突解决
- ZeroMQ(java)中的数据流SessionBase与SocketBase
- 大数据集群工作流及任务管理组件对比
- iOS 注释方法
- JVM-类加载
- android声明的权限
- ZeroMQ,史上最快的消息队列 —– ZMQ的学习和研究
- Linux下 nginx + php 环境搭建
- Integer.ParseInt()异常
- 算法的性质
- iOS 判断设备
- android 分辨率标题栏及状态栏高度
- C++11获取时间戳和时间戳转日期(毫秒精度)
- 浅析iOS中的浅拷贝和深拷贝(copy和mutableCopy)
- 使用CSS的position属性控制页面布局的入门教程
- 文本相似度计算-JaccardSimilarity和哈希签名函数
- acer E5-572G-58HZ 安装GeForce940M+intel双显卡驱动