地址: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; }