#include <iostream>
#include <cstdio>
#include <cmath>
#include <string.h>
#include <algorithm>
#define LL __int64
using namespace std; LL dp[][<<][];
LL aa,bb;
int a[],k;
/*这道题的难点就在于DP的状态表示了,确实是这样的。DP【pos】【state】【K】,pos表示当前的数位,state表示当前的LIS的状态,K
表示要求的K长度。那个DFS就不解释了,都成模板了。而对于state的转移,是用二进制表示当前状态,因为最长的
序列就是0~9十个数表示,所以有十位的二进制。例如12456的上升序列,下一次出现3,则可表示为12356,至于转移,要联系nlogn解法的
LIS来看了 */
int getnews(int x,int s){
for(int i=x;i<;i++)
if(s&(<<i))return (s^(<<i))|(<<x);
return s|(<<x);
}
int getnum(int s){
int ret=;
while(s)
{
if(s&)ret++;
s>>=;
}
return ret;
} LL dfs(int len,int st,bool zero,bool flag){
if(len==) return getnum(st)==k;
if(!flag&&dp[len][st][k]!=-)
return dp[len][st][k];
int en=flag?a[len]:;
LL ans=;
for(int i=;i<=en;i++){
ans+=dfs(len-,(zero&&i==)?:getnews(i,st),zero&&i==,flag&&i==en);
}
if(!flag) dp[len][st][k]=ans;
return ans;
} LL cal(LL n){
LL tmp=n;
int len=;
while(tmp){
a[++len]=(int)(tmp%);
tmp/=;
}
return dfs(len,,true,true);
} int main(){
memset(dp,-,sizeof(dp));
int T,t=;
scanf("%d",&T);
while(++t<=T){
scanf("%I64d%I64d%d",&aa,&bb,&k);
printf("Case #%d: %I64d\n",t,cal(bb)-cal(aa-1LL));
}
return ;
}

最新文章

  1. ReactiveCocoa源码拆分解析(四)
  2. Salt官方将RHEL5/CentOS5 源
  3. cent os下面的基本配置操作
  4. codeblocks中添加-std=c99
  5. Java实战之04JavaWeb-08文件上传与下载
  6. WCF 启用multipleSiteBindingsEnabled 情况下报终结点地址错误
  7. linux管理员
  8. 具体分析Struts工作流程
  9. Redis哈希相关命令
  10. LeetCode 35. Search Insert Position (搜索嵌入的位置)
  11. linux使用freetds 连接连远程服务器sqlservser2012
  12. web安全与防御
  13. C# MVC分页简单介绍
  14. 基于用户的协同过滤电影推荐user-CF python
  15. laravel 错误提示Fatal Error: Class &#39;Pheanstalk\Pheanstalk&#39; not found
  16. main.jsbundle 脱离掉本地服务
  17. day18包的使用与日志(logging)模块
  18. nginx File not found 错误(转)
  19. zoj2112&amp;&amp;bzoj1901
  20. (4)Oracle基础--操作表中数据

热门文章

  1. beisen
  2. [JXOI 2018] 游戏 解题报告 (组合数+埃氏筛)
  3. Mysql外键的变种 三种关系
  4. Scrapy中的UA池,代理池,以及selenium的应用
  5. C# WinForm的练习
  6. css3中的animation属性
  7. Python操作Oracle
  8. 换个语言学一下 Golang (2)——基础语法
  9. 操作ajax生成页面的一个问题
  10. PHP SplObjectStorage使用实例