Codevs P1157 2k进制数 2006年NOIP全国联赛提高组
2015-11-04 16:31
459 查看
1157 2k进制数
2006年NOIP全国联赛提高组
题目描述 Description
设r是个2k进制数,并满足以下条件:
(1)r至少是个2位的2k进制数。
(2)作为2k进制数,除最后一位外,r的每一位严格小于它右边相邻的那一位。
(3)将r转换为2进制数q后,则q的总位数不超过w。
在这里,正整数k(1≤k≤9)和w(k<W<
span>≤30000)是事先给定的。
问:满足上述条件的不同的r共有多少个?
我们再从另一角度作些解释:设S是长度为w 的01字符串(即字符串S由w个“0”或“1”组成),S对应于上述条件(3)中的q。将S从右起划分为若干个长度为k 的段,每段对应一位2k进制的数,如果S至少可分成2段,则S所对应的二进制数又可以转换为上述的2k进制数r。
例:设k=3,w=7。则r是个八进制数(23=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个。
输入描述 Input Description
只有1行,为两个正整数,用一个空格隔开:
k W
输出描述 Output Description
共1行,是一个正整数,为所求的计算结果,即满足条件的不同的r的个数(用十进制数表示),要求最高位不得为0,各数字之间不得插入数字以外的其他字符(例如空格、换行符、逗号等)。
(提示:作为结果的正整数可能很大,但不会超过200位)
样例输入 Sample Input
3 7
样例输出 Sample Output
36
数据范围及提示 Data Size & Hint
分析
通过另一个思路我们可以得知就是在(0~2^k-1)中选出一些数按照从大到小的顺序即可,也就是说没有必要排列,只需选择即可对于首位为0 即为 c[2^k-1,i]i∈(2~w div k);
首位不为0就是在比首位小的数中选出w div k个,作为后面的数字。
首位取值范围为(1~2^(w mod k)-1);-1是因为第一位为2^0次方而不是2^1;
组合数可以通过杨辉三角的方式直接推出,所以只用到了高精加。
代码如下
program p1157; const mp=10000; type num=array[0..55] of longint; var k,j,w,mx,i,maxn,wk,wk2:longint; c:array[0..512,0..512] of num; ans:num; function add(num1,num2:num):num; var i,len:longint; begin if num1[0]>num2[0] then len:=num1[0] else len:=num2[0]; for i:=1 to len do begin num1[i]:=num1[i]+num2[i]; num1[i+1]:=num1[i+1]+num1[i] div mp; num1[i]:=num1[i] mod mp; end; num1[0]:=len; while num1[num1[0]+1]>0 do inc(num1[0]); exit(num1); end; procedure print(x:longint); begin if x<10 then write('000',x) else if x<100 then write('00',x) else if x<1000 then write('0',x) else write(x); end; begin readln(k,w); maxn:=1<
__ __
/ \./ \/\_ I Hand You
__{^\_ _}_ ) }/^\ A Rose...
/ /\_/^\._}_/ // /
( (__{(@)}\__}.//_/__A___A______A_______A______A____
\__/{/(_)\_} )\\ \\---v----V-----V--Y----v---Y-----
( (__)_)_/ )\ \>
\__/ \__/\/\/
\__,--'
我只是想造一个分割线。。。。。。
评测结果
测试点#digital1.in 结果:AC 内存使用量:57600kB 时间使用量: 36ms
测试点#digital10.in 结果:AC 内存使用量:
57604kB 时间使用量: 38ms
测试点#digital2.in 结果:AC 内存使用量:
57712kB 时间使用量: 39ms
测试点#digital3.in 结果:AC 内存使用量:
57600kB 时间使用量: 37ms
测试点#digital4.in 结果:AC 内存使用量:
57712kB 时间使用量: 41ms
测试点#digital5.in 结果:AC 内存使用量:
57708kB 时间使用量: 43ms
测试点#digital6.in 结果:AC 内存使用量:
57708kB 时间使用量: 43ms
测试点#digital7.in 结果:AC 内存使用量:
57708kB 时间使用量: 42ms
测试点#digital8.in 结果:AC 内存使用量:
57708kB 时间使用量: 45ms
测试点#digital9.in 结果:AC 内存使用量:
57708kB 时间使用量: 55ms
* * * * * * *
* * * * *
<======== *== *==<<<<<<
* * *
* * * *
* *
马上考试了。。。唉。。。
————————————————————————————————————————————————————————————————————————————
Innocent
guess you really did it this time我想你这次是真的那样做了
Left yourself in your warpath
亲手把自己丢在了孤立无援的境地
Lost your balance on a tightrope
就像是在钢丝上失去了平衡
Lost your mind tryin’ to get it back
费尽心思想做回原来的你
Wasn’t it easier in your lunchbox days?
但是在悠闲的白天吃午餐里不是更容易吗?
Always a bigger bed to crawl into
而且总有一个更大的床能够翻来覆去
Wasn’t it beautiful when you believed in everything?
当你相信所有事情的时候难道不是很美丽的吗?
And everybody believed in you?
而且所有人也相信了你
It’s alright, just wait and see
一切都很好,只需要等待并向前看
Your string of lights is still bright to me
你那一束微弱的光对我来说依旧明亮
Oh, who you are is not what you’ve been
你做过的事情并不代表现在的你
You’re still an innocent
你仍然是这么的天真
You’re still an innocent
甚至是无罪的
Did some things you can’t speak of
有些话你无法说出口
But tonight you’ll live it all again
但今晚你将它们重蹈覆辙
You wouldn’t be shattered on the floor now
你不会在舞台上被毁掉
If only you had seen what you know now then
除非你当时看到了你现在知道的事
Wasn’t it easier in your firefly-catchin’ days?
但是在捉萤火虫开心的日子里不不是很容易吗?
And everything out of reach, someone bigger brought down to you
而且那些你够不到的东西,总会有更强大的人帮你拿到
Wasn’t it beautiful runnin’ wild ’til you fell asleep?
一直奔跑直到你困得入睡不是很好吗?
Before the monsters caught up to you
特别是在坏蛋能够抓到你之前
It’s alright, just wait and see
一切都很好,只要你等待并向前看
Your string of lights is still bright to me
甚至你那一束微弱的光对我来说依旧明亮
Oh, who you are is not what you’ve been
你之前做的事情并不代表现在的你
You’re still an innocent
你仍然是无辜的
It’s okay, life is a tough crowd
没关系,生活本来就很艰辛
32, and still growin’ up now
32岁的你,依然在成长
Who you are is not what you did
你曾经做了什么事情并不意味着现在的你是谁
You’re still an innocent
你仍然是无辜的
Time turns flames to embers
时间把火焰变成灰烬
You’ll have new Septembers
你也会迎来一个新的九月
Every one of us has messed up too
任何人都会犯错
Minds change like the weather
想法就像天气一样变换无常
I hope you remember
我只希望你能记住
Today is never too late to Be brand new
改变自己永远都不算迟
It’s alright, just wait and see
没关系,只要等待并向前看
Your string of lights is still bright to me
而你那一束微弱的光对我来说依旧明亮
Oh, who you are is not what you’ve been
你做过的事情不代表现在的你
You’re still an innocent
你是无罪的
It’s okay, life is a tough crowd
没关系,生活本来就很艰辛
32, and still growin’ up now
32岁的你,依然在成长
Who you are is not what you did
你曾经做了什么并不意味着你是谁
You’re still an innocent
你仍然是无辜的
You’re still an innocent
你是无罪的
Lost your balance on a tightrope
即使真的在钢丝上行走时失去了平衡
It’s never too late to get it back
下一秒重新站起来,也不算迟
____________________________________________________________________________________________________________________________________
永远不会忘记(。。。)