蓝桥杯K进制数题解

考虑包含N位数字的K-进制数. 定义一个数有效, 如果其K-进制表示不包含两连续的0. 

例: 
1010230 是有效的7位数 
1000198 无效 
0001235 不是7位数, 而是4位数. 

给定两个数N和K, 要求计算包含N位数字的有效K-进制数的总数. 

假设2 <= K <= 10; 2 <= N; 4 <= N+K <= 18.


   这个题应该是一个递推题。可以用f[i]表示i位(最高位是第i位)K进制数的总数,那么就应该有:f[i]=(f[i-1]+f[i-2])*(k-1)。

解释一下:f[i]也就是i位K进制数的总数应该等于:第i-1位为0与第i-1位不为0的情况的和乘以第i位的情况数(1..k-1)

(1)第i-1位为0的情况应该等于i-2位不为0的情况总数,即f[i-2]

(2)第i-1位不为0的情况应该等于f[i-1]

所以f[i]=(f[i-1]+f[i-2])*(k-1)

代码:

#include <iostream>
#include<algorithm>
using namespace std;
long long a[2000];
int main(int argc, char const *argv[]){
	int n, k;
	cin >> n >> k;
	a[1] = k -1;
	a[2] = k * (k - 1);
	if(n < 3)
		cout << a[n] << endl;
	else{
		for (int i = 3; i <= n; ++i)
			a[i] = (a[i - 1] + a[i - 2]) * (k - 1);
			cout << a[n] << endl;
	}
	return 0;
}



猜你喜欢

转载自blog.csdn.net/qq_36561697/article/details/80377744