Intervals

题目连接:

http://codeforces.com/gym/100231/attachments

Description

Start with an integer, N0, which is greater than 0. Let N1 be the number of ones in the binary representation of N0. So, if N0 = 27, N1 = 4. For all i > 0, let Ni be the number of ones in the binary

representation of Ni−1. This sequence will always converge to one. For any starting number, N0, let K be the minimum value of i ≥ 0 for which Ni = 1. For example, if N0 = 31, then N1 = 5, N2 = 2, N3 = 1, so K = 3. Given a range of consecutive numbers, and a value X, how many numbers in the range have a K value equal to X?

Input

There will be several test cases in the input. Each test case will consist of three integers on a single line:

l, r, X, where l and r (1 ≤ l ≤ r ≤ 1018) are the lower and upper limits of a range of integers, and X

(0 ≤ X ≤ 10) is the target value for K. The input will end with a line with three 0s.

Output

For each test case, output a single integer, representing the number of integers in the range from l to

r (inclusive) which have a K value equal to X in the input. Print each integer on its own line with no

spaces. Do not print any blank lines between answers.

Sample Input

31 31 3

31 31 1

27 31 1

27 31 2

1023 1025 1

1023 1025 2

0 0 0

Sample Output

1

0

0

3

1

1

Hint

题意

首先给你Ni的定义,表示第几轮的时候,这个数是多少,Ni = Ni-1二进制表示下的1的个数

k 表示第几步的时候,Ni = 1

给你l,r,x

问你在l,r区间内,k等于x的数有多少个

题解:

我们首先预处理vis[i]表示有i个1的时候的步数,这个用dp很容易解决

然后我们就可以数位dp去做了,做[1,x]里面二进制数为k个的数量

注意特判1的情况,比较麻烦

代码

#include<bits/stdc++.h>
using namespace std; long long l,r,t;
int vis[100];
long long ans = 0;
int getone(long long x)
{
int c=0;
while(x>0)
{
if((x&1)==1)
c++;
x>>=1;
}
return c;
}
long long f[70][70];
void init()
{
memset(f,0,sizeof(f));
f[0][0] = 1LL;
for(int i=1;i<=62;i++)
{
f[i][0] = 1LL;
for(int j=1;j<=i;j++)
{
f[i][j] = f[i-1][j-1] + f[i-1][j];
}
}
}
long long calc(long long x,int k)
{
int tot = 0;
long long ans = 0;
for(long long i=62;i>0;i--)
{
if(x&(1LL<<i))
{
tot++;
if(tot>k) break;
x ^= (1LL<<i);
}
if((1LL<<(i-1LL))<=x)
{
if(k>=tot)
ans += f[i-1][k-tot];
}
}
if(tot + x == k) ans++;
return ans;
}
long long solve(long long limit,int x)
{
ans=0;
for(int i=1;i<=61;i++)
if(vis[i]==x)
{
if(i==1)
ans--;
ans+=calc(limit,i);
}
return ans;
}
int main()
{
init();
vis[1]=1;
for(int i=2;i<=61;i++)
vis[i]=vis[getone(i)]+1;
while(scanf("%lld%lld%d",&l,&r,&t)!=EOF)
{
if(l==0&&r==0&&t==0)return 0;
if(t==0)
{
if(l==1)
printf("1\n");
else
printf("0\n");
continue;
}
if(t==1)
{
if(l==1)
printf("%lld\n",solve(r,t)-solve(l-1,t)-1);
else
printf("%lld\n",solve(r,t)-solve(l-1,t));
}
else
printf("%lld\n",solve(r,t)-solve(l-1,t));
}
}

Codeforces Gym 100231L Intervals 数位DP的更多相关文章

  1. codeforces 55D - Beautiful numbers(数位DP+离散化)

    D. Beautiful numbers time limit per test 4 seconds memory limit per test 256 megabytes input standar ...

  2. Codeforces #55D-Beautiful numbers (数位dp)

    D. Beautiful numbers time limit per test 4 seconds memory limit per test 256 megabytes input standar ...

  3. Codeforces - 55D Beautiful numbers (数位dp+数论)

    题意:求[L,R](1<=L<=R<=9e18)区间中所有能被自己数位上的非零数整除的数的个数 分析:丛数据量可以分析出是用数位dp求解,区间个数可以转化为sum(R)-sum(L- ...

  4. CodeForces - 55D - Beautiful numbers(数位DP,离散化)

    链接: https://vjudge.net/problem/CodeForces-55D 题意: Volodya is an odd boy and his taste is strange as ...

  5. Codeforces Gym 100231B Intervals 线段树+二分+贪心

    Intervals 题目连接: http://codeforces.com/gym/100231/attachments Description 给你n个区间,告诉你每个区间内都有ci个数 然后你需要 ...

  6. CodeForces 628D Magic Numbers (数位dp)

    题意:找到[a, b]符合下列要求的数的个数. 1.该数字能被m整除 2.该数字奇数位全不为d,偶数位全为d 分析: 1.dp[当前的位数][截止到当前位所形成的数对m取余的结果][当前数位上的数字是 ...

  7. FZU2179/Codeforces 55D beautiful number 数位DP

    题目大意: 求  1(m)到n直接有多少个数字x满足 x可以整出这个数字的每一位上的数字 思路: 整除每一位.只需要整除每一位的lcm即可 但是数字太大,dp状态怎么表示呢 发现 1~9的LCM 是2 ...

  8. CodeForces - 55D Beautiful numbers —— 数位DP

    题目链接:https://vjudge.net/problem/CodeForces-55D D. Beautiful numbers time limit per test 4 seconds me ...

  9. Codeforces 981 D.Bookshelves(数位DP)

    Codeforces 981 D.Bookshelves 题目大意: 给n个数,将这n个数分为k段,(n,k<=50)分别对每一段求和,再将每个求和的结果做与运算(&).求最终结果的最大 ...

随机推荐

  1. 几种ESB(企业服务总线)介绍

    ESB(Enterprise Service Bus,即企业服务总线)是传统中间件技术与XML.Web服务等技术结合的产物.ESB提供了网络中最基本的连接中枢,是构筑企业神经系统的必要元素. 企业服务 ...

  2. Linux上修改weblogic的内存大小

    我们经常在使用WebLoigc部署应用程序后,发现程序运行速度并不是很快,遇到这种情况我们可以尝试调整启动时分配的内存,设置方法有两种: 一.在../domain/setDomainEnv.sh文件中 ...

  3. Linux操作系统中,.zip、.tar、.tar.gz、.tar.bz2、.tar.xz、.jar、.7z等格式的压缩与解压

    zip格式 压缩: zip -r [目标文件名].zip [原文件/目录名] 解压: unzip [原文件名].zip 注:-r参数代表递归 tar格式(该格式仅仅打包,不压缩) 打包:tar -cv ...

  4. DOM笔记(九):引用类型、基本包装类型和单体内置对象

    一.Array 1 .创建数组的方式 //Array构造函数(可以去掉new) var colors0 = new Array(); var colors1 = new Array(20); var ...

  5. jquery ajax跨域的完美解决方法(jsonp方式)

    ajax跨域请求的问题,JQuery对于Ajax的跨域请求有两类解决方案,不过都是只支持get方式,接下来为大家详细介绍下客户端JQuery.ajax的调用代码     今天在项目中需要做远程数据加载 ...

  6. 【原创】用JAVA实现大文件上传及显示进度信息

    用JAVA实现大文件上传及显示进度信息 ---解析HTTP MultiPart协议 (本文提供全部源码下载,请访问 https://github.com/grayprince/UploadBigFil ...

  7. NServiceBus教程-NServiceBus和WCF

    WCF中缺少的最主要的事情是发布/订阅,但为什么你必须建立它自己吗?NServiceBus,你把它弄出来. 下一个重要的事情是容错.异常导致WCF代理休息,需要"刷新"的代码,但调 ...

  8. Strider安装(Ubuntu)

    安装: git clone https://github.com/Strider-CD/strider.git && cd strider nam install 然而还是出现一大波错 ...

  9. 转】MyEclipse使用总结——MyEclipse文件查找技巧

    原博文出自于:http://www.cnblogs.com/xdp-gacl/p/3781749.html 感谢! 一.查找文件 使用快捷键[ctrl+shift+R]弹出弹出文件查找框,如下图所示: ...

  10. HD1005Number Sequence

    Number Sequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tota ...