题目描述
考虑包含N位数字的K-进制数. 定义一个数有效, 如果其K-进制表示不包含两连续的0.
考虑包含N位数字的K-进制数. 定义一个数有效, 如果其K-进制表示不包含两连续的0.
例:
1010230 是有效的7位数
1000198 无效
0001235 不是7位数, 而是4位数.
给定两个数N和K, 要求计算包含N位数字的有效K-进制数的总数.
假设2 <= K <= 10; 2 <= N; 4 <= N+K <= 18.
输入
两个十进制整数N和K
输出
十进制表示的结果
样例输入
2
10
样例输出
90


//K进制 递推牛逼 #include<stdio.h> int k; int f(int n) { if(n == 1) { return k-1; } else if(n == 2) { return (k-1)*k; } else { return f(n-1)*(k-1) + f(n-2)*(k-1) ; } } int main() { int n; scanf("%d%d", &n, &k); printf("%d\n",f(n)); return 0; }
不能连续两个0 与第一位不能为0,存在递推关系
实际上是一个深搜问题 dfs
1.最高位不能是0


#include<iostream> using namespace std; int n,k;//n是位数,k是进制数 char s[20]; int total; void dfs(int cur){ char temp; if(cur==n) total++; else for(int i=0;i<k;i++){ temp = i+'0'; if((cur==0 && temp == '0') || (temp == '0' && s[cur-1] == '0')) continue; s[cur] = i+'0'; dfs(cur+1); } } int main(){ cin>>n>>k; dfs(0); cout<<total<<endl; }