大意: 对于一个数$x$, 每次操作可将$x$变为$x$二进制中1的个数

定义经过k次操作变为1的数为好数, 求$[1,n]$中有多少个好数

注意到n二进制位最大1000位, 经过一次操作后一定变为1000以内的数, 所以可以暴力求出1000以内的数变为1的操作次数,

记$G_i$为$[1,n]$中二进制中1的个数为i的个数, 数位dp求出$G_i$后, 再用乘法原理就可以得出结果

要特判k为0和1的情况, k=1时会将1多算一次最后减去1

#include <iostream>
#include <bitset>
#define PER(i,a,n) for(int i=n;i>=a;--i)
#define REP(i,a,n) for(int i=a;i<=n;++i)
using namespace std;
typedef long long ll;
const int P = 1e9+7, N = 1e3+10; bitset<N> bit;
ll G[N], cnt[N], C, k; int main() {
cin>>bit>>k;
if (!k) return cout<<1<<endl,0;
PER(j,0,N-1) {
PER(i,1,N-1) (G[i]+=G[i-1])%=P;
if (bit[j]) ++G[C++];
}
++G[C];
REP(i,2,N-1) cnt[i]=cnt[__builtin_popcount(i)]+1;
ll ans = 0;
REP(i,1,N-1) if (cnt[i]==k-1) (ans+=G[i])%=P;
if (k==1) --ans;
cout<<ans<<endl;
}

最新文章

  1. mvc架构
  2. angularjs 过滤器详解
  3. Java的内部类
  4. MySQL主机127.0.0.1与localhost区别总结
  5. 《objective-c基础教程》学习笔记(八)—— 拆分接口和实现
  6. git备忘(长久更新)
  7. Android系统服务-简介
  8. CodeForces 443B Kolya and Tandem Repeat
  9. 二、Cocos2dx概念介绍(游戏开发中不同的坐标系,cocos2dx锚点)
  10. 发布Activex全过程
  11. subversion-fundamental concepts
  12. Linux 环境编译安装mysql (源码安装包)
  13. Python(一)字符串用法
  14. Kafka学习笔记1:概念
  15. mongodb 遇到问题-查询单个需要包装id
  16. buffer IO和direct IO
  17. WinForm 之 窗口最小化到托盘及右键图标显示菜单
  18. Apktool的安装与使用
  19. leetcode 199. Binary Tree Right Side View 、leetcode 116. Populating Next Right Pointers in Each Node 、117. Populating Next Right Pointers in Each Node II
  20. BZOJ.1935.[SHOI2007]Tree园丁的烦恼(CDQ分治 三维偏序)

热门文章

  1. python网络编程之一
  2. Git 的安装步骤
  3. c++的各种类型转换方式
  4. django admin 使用
  5. P1471 方差
  6. TeeChart缩放
  7. BZOJ1304: [CQOI2009]叶子的染色 树形dp
  8. POJ 1011 Sticks(dfs+剪枝)
  9. MVC ---- 如何使用Predicate以及如何自定定义Predicate委托
  10. pyqt 实现的俄罗斯方块