【Ural1057】幂和的数量
【题目描述】
写一个程序来计算区间[X,Y]内满足如下条件的整数个数:它恰好等于K个互不相等的B的整数幂之和。
举个例子。令X=15,Y=20,K=2,B=2。在这个例子中,区间[15,20]内有3个整数恰好等于两个互不相等的2的整数幂之和:
17=2^4+2^0
18=2^4+2^1
20=2^4+2^2
【输入格式】
输入文件的第一行有两个空格隔开的整数X,Y(1<=X<=Y<=2^31-1).
第二行有两个整数K,B(1<=K<=20,2<=B<=10).
【输出格式】
输出一行一个整数,即[X,Y]中恰好等于K个互不相等的B的整数幂之和的数的个数。
【分析】
数位类统计,上一张图:

用f[i][j]来表示高度为i的二叉树下进制位有j个为1的数的个数。
对于询问n,我们需要求出不超过n的最大B进制表示只含0、1的数:
找到n 的左起第一位非0、1 的数位,将它变为1,并将右面所有数位设为1。(因为大于1的肯定不可取,后面置为1使它最接近原来的数)
将得到的B进制表示视为二进制进行询问即可。
#include <cstdio>
#include <iostream>
#include <cstring>
int f[][];
int x,y,k,b; int work(int x,int k);
int change(int x);
int main()
{
int i,j;
//初始化
f[][]=;
for(i=;i<=;i++)
{
f[i][]=f[i-][];
for(j=;j<=i;j++)
f[i][j]=f[i-][j]+f[i-][j-];
}
scanf("%d%d%d%d",&x,&y,&k,&b);
printf("%d\n",work(change(y),k)-work(change(x-),k));
return ;
}
int change(int x)
{
int p=,tot=;
while(x>=(long long)p*b) p*=b,++tot;//用来统计有tot个b进制位
int ans=;
//b进制转2进制
while(p && x/p<=)
{
ans+=x/p*(<<tot);
tot--;
x%=p;
p/=b;
}
ans+=(<<(tot+))-;
return ans;
}
//统计[0..x]内二进制表示含k个1的数的个数
int work(int x,int k)
{
//tot记录当前路径上已有的1的数量
int ans=,tot=;
for(int i=;i;i--)
{
if(x&(<<i))
{
++tot;
//跳出
if(tot>k)break;
x^=(<<i);
}
if((<<(i-))<=x)
ans+=f[i-][k-tot];
}
if(x+tot==k)++ans;
return ans;
}
【Ural1057】幂和的数量的更多相关文章
- upc组队赛1 闪闪发光 【优先队列】
闪闪发光 题目描述 一所位于云南昆明的中医药本科院校--云南中医学院. 因为报考某专业的人数骤减,正面临着停招的危机. 其中有九名少女想到一条妙计--成为偶像, 只要她们成为偶像,学校的名气便会增加, ...
- 问题 I: 闪闪发光
[提交] [状态] [命题人:外部导入] 题目描述 一所位于云南昆明的中医药本科院校--云南中医学院. 因为报考某专业的人数骤减,正面临着停招的危机. 其中有九名少女想到一条妙计——成为偶像, 只要她 ...
- Kattis - cokolada【水】
Kattis - cokolada[水] 题意 有一个人想吃巧克力,但是巧克力都是按照 2 的幂次的数量包装的,然后他想吃一定数量块的巧克力,然后可以敲碎,每次敲碎都分成两半,比如四块装的分成两块就是 ...
- hdu 5015 大数量反复类似操作问题/ 矩阵高速幂
题意: 给一个矩阵a,第一行是 0. 233,2333,23333.....第一列读入.列数<10^9.行数<=10. 先转化操作: m是大数量.必定每次向前推一列.就是每次乘一个矩阵T. ...
- 51nod 1197 字符串的数量 V2(矩阵快速幂+数论?)
接上一篇,那个递推式显然可以用矩阵快速幂优化...自己随便YY了下就出来了,学了一下怎么用LaTeX画公式,LaTeX真是个好东西!嘿嘿嘿 如上图.(刚画错了一发...已更新 然后就可以过V2了 or ...
- poj 3735 大数量反复操作问题(矩阵高速幂)
题意:一个一维数组,3种操作: a: 第i个数+1,b: 第i个数=0 ,c::交换某俩处的数. 由三种基本操作构成一组序列,反复该序列m次(m<10^9),问结果 属于一种综合操作反复型: ...
- Codeforces632E Thief in a Shop(NTT + 快速幂)
题目 Source http://codeforces.com/contest/632/problem/E Description A thief made his way to a shop. As ...
- poj 3734 Blocks 快速幂+费马小定理+组合数学
题目链接 题意:有一排砖,可以染红蓝绿黄四种不同的颜色,要求红和绿两种颜色砖的个数都是偶数,问一共有多少种方案,结果对10007取余. 题解:刚看这道题第一感觉是组合数学,正向推了一会还没等推出来队友 ...
- poj 3734 矩阵快速幂+YY
题目原意:N个方块排成一列,每个方块可涂成红.蓝.绿.黄.问红方块和绿方块都是偶数的方案的个数. sol:找规律列递推式+矩阵快速幂 设已经染完了i个方块将要染第i+1个方块. a[i]=1-i方块中 ...
随机推荐
- 嵌入式系统烧写uboot/bootloader/kernel的一般方法
嵌入式系统烧写uboot/bootloader/kernel的一般方法 本文介绍了在嵌入式系统中烧写uboot/bootloader/kernel 的一般方法,以及如果uboot或者内核出现错误, ...
- robotium源码方法备注---clicker.java
1.clickOnScreen(float x,float y) 在屏幕上点击一个指定的区域(x,y)横纵坐标 2.clickLongOnScreen(float x,float y, int tim ...
- if form1.showmodal:=mrok then 什么意思
if form1.showmodal:=mrok then 这句话什么意思? 最佳答案 这个问题说来话长,且听我慢慢道来... 首先,你仔细看一看,所有的命令按钮(不论是Button还是BitBtn) ...
- Sicily1059-Exocenter of a Trian
代码地址: https://github.com/laiy/Datastructure-Algorithm/blob/master/sicily/1059.c 1059. Exocenter of a ...
- socket编程五种模型
客户端:创建套接字,连接服务器,然后不停的发送和接收数据. 比较容易想到的一种服务器模型就是采用一个主线程,负责监听客户端的连接请求,当接收到某个客户端的连接请求后,创建一个专门用于和该客户端通信的套 ...
- asterisk manager api 配置 (manager.conf)
http://blog.csdn.net/niino/article/details/5748805 要激活AMI,需要在/etc/asterisk/manager.conf中,[general]块下 ...
- Google翻译
本博文的主要内容有 .Google翻译的介绍 .Google翻译之一:内容板块的翻译 .Google翻译之二:网页的翻译 .Google翻译之四:文档的翻译 .Google翻译之四 ...
- .\Obj\main.axf: Error: L6406E: No space in execution regions with .ANY selector matching sin_i.o(.co
这个问题原因是 芯片的 空间不足 解决方法是 在KEIL 的DEVICE中选择 更大的空间的芯片型号
- JSON 和 JSONP
本文转载:http://www.cnblogs.com/shanyou/archive/2009/12/13/1623163.html JSON 和 JSONP 浏览器安全模型规定,XMLHttpR ...
- Android 判断数据库中是否存在某个表
public boolean tabIsExist(String tabName){ boolean result = false; if(tabName == null){ return false ...