zoukankan      html  css  js  c++  java
  • 蓝桥杯 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;
    }
  • 相关阅读:
    MySQL 报错记录
    Python连接MySQL
    Linux-mail设置
    样式学习--参照Oracle写法
    Shell的for和select
    Shell 定时发送邮件检查网站脚本/邮件正文
    Linux之 AWK SED
    MySQL excel导入
    《iOS三问》 -- 从动画系统的实现谈iOS核心动画

  • 原文地址:https://www.cnblogs.com/liyexin/p/13779796.html
Copyright © 2011-2022 走看看