涂鸦

来源:互联网 发布:网络在线课堂 编辑:程序博客网 时间:2024/05/16 01:44

Problem Description

图书馆下面有个地下室,现在被用做自习室。大概是疏于管理,那里的桌子上都被涂画得不像样子。有调皮的打油诗或搞怪的漫画,或者仅仅是无趣的“某某到此一游”。
我倒很喜欢来这个自习室,一则阴凉清净,二来无聊的时候我也在那桌面上填上几笔。某天自习的时候,我在那上面找了个空白的地方画了几个圈圈:0000。
第二天我再去的时候,那几个圈圈的下面不知道被谁添上了一行:0001。只是觉得好玩,于是我又在那下面填上一行:0011。
就这样接力似的写了好些天后,桌面出现了这么一列数字:
0000
0001
0011
0010
0110
0111
0101
0100
1100
......
之前都是胡乱涂写,这时我才发现一点门道:这列数都是L位B进制数(在这里是4位二进制数)。除了第一个数一定是0以外,每个数都与它的前一个数只有一个数位有差别。具体来说,对于第i个数(i>1),如果i-1(注意不是第i-1个数)刚好能被B的k次方整除,而不能被B的k+1次方整数(注意B的零次方等于1),那么这个数与第i-1个数的区别就是右边数起第k+1位被加了1,如果该位加1后结果是B则改为0.
我突然很想知道这列数的前N个有多少个不同的数。谁能帮我算一下呢?

Input

输入有多组数据,每组数据的只有一行,包含三个正整数L,B和N,并保证B的L次方大于等于N,其中L<=31,B<=9,N<2^31。

Output

对于每组数据输出一个整数,表示这列数的前N个中有多少个不同的数。

Sample Input

4 2 9

Sample Output

9

Author

HYNU

# include<cstdio># include<iostream>using namespace std;int main(){    __int64 l,b,n;    while(cin>>l>>b>>n)    {        __int64 sum=1;        int i;        for(i=0;i<l;i++)    sum*=b;        if(n<=sum)    cout<<n<<endl;        else    cout<<sum<<endl;    }    return 0;}


0 0
原创粉丝点击