这题说的是给了一个二进制数R , 计算出 在[0,R) 区间内的数, 二进制中有n个1 个和

n<=1000; R<2^1000, 这样 用dp[len][lee] 表示在第len位的时候已经放了lee个1 个总和, num[len][lee] 表示在第len位的时候已经放了lee个1 个数有多少个,这样只要考虑当前位置放1与不放1 记忆化进行搜索

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <string.h>
using namespace std;
const int maxn =;
typedef long long ll;
const ll mod=;
ll dp[maxn][maxn];
ll num[maxn][maxn];
char str[maxn];
ll dig[maxn];
void dfs(int loc, int lee , bool e, ll &value, ll &ge)
{
value = ge = ;
if(e==false&& num[loc][lee]!=- ){
value=dp[loc][lee]; ge =num[loc][lee]; return ;
}
if(loc==&&lee==){
value=, ge=; return ;
}
int we = e? str[loc-]-'':;
ll ans=, nu=;
if(we==){
if(loc->=lee){
dfs(loc-,lee,false,ans,nu);
value=ans, ge=nu;
}
if( lee > ){
dfs(loc-,lee-,e,ans, nu);
value=( value + ans + ( dig[loc-] )*nu%mod )%mod;
ge = ( nu + ge )%mod;
}
}else{
if(loc->=lee){
dfs(loc-,lee,e,ans,nu);
value= ans; ge=nu;
}
}
if(e==false) { dp[loc][lee] = value, num[loc][lee]=ge; }
}
int main()
{
int n;
dig[]=;
for(int i=; i<=; ++i)
dig[i]=(dig[i-]*)%mod;
while(scanf("%d%s",&n,str)==){
int len = strlen(str);
for(int i=; i<len/; ++i){
char c = str[i];
str[i]=str[len--i];
str[len--i]=c;
}
memset(dp,,sizeof(dp));
memset(num,-, sizeof(num));
memset(num[],,sizeof(num[]));
num[][]=;
ll ans=,nu=;
dfs( len , n , true, ans, nu);
ll digt=;nu=;
for(int i=; i<len; ++i){
if(str[i]==''){
digt++; nu= ( nu + dig[i])%mod;
}
}
if(digt==n) ans=(ans-nu+mod)%mod;
printf("%I64d\n",ans);
}
return ;
}

最新文章

  1. oracle函数案例以及分页案例
  2. 二.持续集成之--WEB后台
  3. 使用PS3手柄在PC玩Unity3D游戏
  4. MOGRE学习笔记(1) - OGRE简介及在vs2010下配置
  5. nodejs 调用 OC 方法
  6. 一、Microsoft Dynamics CRM 4.0 SDK概述
  7. MVC3 使用NPOI导出excel
  8. Tomcat 6.0下配置HTTPS
  9. COJN 0575 800601滑雪
  10. 批量升级BMC固件asu64、ipmitool
  11. 三星Samsung 4.4.2该负责人制度,简化名单
  12. 关于springboot启动时候报错:springboot Failed to parse configuration class [Application]
  13. B - 瑶瑶带你玩激光坦克
  14. jmeter问题处理随笔1 - CSV取值数据异常处理(包含&quot;号,&quot;,&quot;号的情况)
  15. uvalive 3135 Argus
  16. R-- Apply族函数
  17. css选择器语法速查
  18. Spring Security OAuth2 Demo -- good
  19. JDBC 连接数据库,包含连接池
  20. 在 Azure 虚拟机中配置 Always On 可用性组(经典)

热门文章

  1. 【RF库Collections测试】Get Dictionary Items
  2. VS2015编译OpenSSL1.0.2源码
  3. linux系统usb挂载
  4. #error和line
  5. 《转》我眼中的C# 3.0
  6. JS基本动画
  7. Android之ListView分页数据加载
  8. HTML的特殊字符-图标对应表
  9. linux 程序启动与停止管理脚本
  10. JFinal的启动源码解读