蓝桥杯 K-进制数(DFS)

地址:https://www.dotcpp.com/oj/problem1117.html

 

 解析:

对于K进制数,每个位置的数是0~k-1的。

首先看首位,必不能为0,那么有k-1种选法 。

定义idx,表示当前不为0的位置下标。

接下来,有两种选择,一个是第二位为0,一个是第二位不为0。

如果要第二位为0,那么就把idx+2,跳到第三位,当前数目为(k-1)^2

如果第二位不为0,那么,idx+1到达第二位,如果接下来第三位还不为0,那么数目到了(k-1)^3

可以发现,每一步,有两种选择方式,要么隔一个0,idx+2;要么接着放k-1种,idx+1。所以,这是一个dfs的过程。

我们每次跳的idx的位置,都是非0位,所以每次都要乘(k-1),跳了几次,就是几次幂,就是这个step

如果idx==n了,说明最后一位不为0

如果idx==n+1了,说明最后一位为0,那么总数就需要少算一位,为(k-1)^(step-1)

#include <bits/stdc++.h>
#include<vector>
using namespace std;
typedef long long ll;
const int maxn =1e2+30;
int n,k;
int cnt =  0 ;
void dfs(int idx,int step)
{
    
    int move[3]={1,2};
    if(idx==n)
    {
        cnt+=pow(k-1,step);
        return;
    }
    if(idx==n+1)
    {
        cnt+=pow(k-1,step-1);
        return ;
    }
    for(int i=0;i<=1;i++)
    {
        int md=idx;
        md+=move[i];
        dfs(md,step+1);
    }
}
int main()
{
    cin>>n>>k;
    dfs(1,1);
    cout<<cnt<<endl;
}

 

posted @ 2020-10-07 23:15  liyexin  阅读(193)  评论(0)    收藏  举报