【New AKOJ】1000: 2^k进制数
2016-05-19 14:47
148 查看
1000: 2^k进制数
时间限制: 1 Sec 内存限制: 128 MB提交: 3 解决: 2
原题链接
题目描述
设r是个2^k 进制数,并满足以下条件:(1)r至少是个2位的2^k 进制数。
(2)作为2^k 进制数,除最后一位外,r的每一位严格小于它右边相邻的那一位。
(3)将r转换为2进制数q后,则q的总位数不超过w。
在这里,正整数k(1≤k≤9)和w(k〈w≤30000)是事先给定的。
问:满足上述条件的不同的r共有多少个?
我们再从另一角度作些解释:设S是长度为w 的01字符串(即字符串S由w个“0”或“1”组成),S对应于上述条件(3)中的q。将S从右起划分为若干个长度为k 的段,每段对应一位2^k进制的数,如果S至少可分成2段,则S所对应的二进制数又可以转换为上述的2^k 进制数r。
例:设k=3,w=7。则r是个八进制数(2^3=8)。由于w=7,长度为7的01字符串按3位一段分,可分为3段(即1,3,3,左边第一段只有一个二进制位),则满足条件的八进制数有:
2位数:高位为1:6个(即12,13,14,15,16,17),高位为2:5个,…,高位为6:1个(即67)。共6+5+…+1=21个。
3位数:高位只能是1,第2位为2:5个(即123,124,125,126,127),第2位为3:4个,…,第2位为6:1个(即167)。共5+4+…+1=15个。
所以,满足要求的r共有36个。
输入
只有1行,为两个正整数,用一个空格隔开:k w
输出
1行,是一个正整数,为所求的计算结果,即满足条件的不同的r的个数(用十进制数表示),要求最高位不得为0,各数字之间不得插入数字以外的其他字符(例如空格、换行符、逗号等)。(提示:作为结果的正整数可能很大,但不会超过200位)
样例输入
3 7样例输出
36Source:
#include<iostream> #include<cmath> using namespace std; int t[200]={0}; int Isjz(int n,int k) //进制转化 { for(int j=0;j<200;j++) {t[j]=0;} int i=0; while(n) { t[i]=n%k; //将转化的k进制数各个位数字保存 n/=k; i++; } return i; //返回转化为k进制后,位数 } int IsR(int n,int k) //判读是否为R { int flag=1; int m=Isjz(n,k); for(int i=0;i<m-1;i++) { if(t[i]<=t[i+1]) {flag=0;break;} } return flag; } void Add(int *c) //数组统计 { c[0]++; for(int i=0;i<199;i++) //十进制加法 { if(c[i]>=10) {c[i]-=10;c[i+1]++;} } } int main() { int k,w,c[200]={0},s; cin>>k>>w; s=(int)pow(2,k); for(int i=s;i<(int)pow(2,w);i++) //i从s开始保证是10开始遍历,即题目的大于等于两位。 //而二进制又不能大于w位 ,所以这里小于2^w { if(IsR(i,s)) {Add(c);} } int i,j; for(i=199;i>=0;i--) //排除前导零 { if(c[i]!=0) {break;} } for(j=i;j>=0;j--) { cout<<c[j]; } return 0; }
相关文章推荐
- 实现ScrollView滑动时标题栏的隐藏效果
- eclipse做界面插件安装
- Bottom Sheets(底部动作条)使用介绍
- MySQL命令行导出数据库
- Windows下github使用说明
- Unity 基础 - Input 类
- dhcp配置固定ip
- ThinkAndroid简介
- Java生成kml文件
- iOS通过dSYM文件分析crash
- java生成二维码
- firewall-config保持配置的方法
- QQ的小秘密
- Python爬虫使用Selenium+PhantomJS抓取Ajax和动态HTML内容
- 领域驱动/DDD模型初识
- Ngnix在Windows下的环境配置及使用 - 引言
- 云主机硬盘挂载
- Android Looper 分析2(图)
- android---JNI:GetPrimitiveArrayCritical 错误
- Ionic 常见问题及解决方案