涂鸦

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值