余子涵


私信TA

用户名:dotcpp0595408

访问量:990

签 名:

等  级
排  名 540
经  验 4296
参赛次数 0
文章发表 4
年  龄 0
在职情况 学生
学  校 长江大学
专  业 电子信息工程

  自我简介:

TA的其他文章

解题思路:
回顾一下题目要求,考虑包含N位数字的K-进制数,如果在该N位K-进制数中不包含两个连续的0,则将其定义为一个有效数,统计所有有效N位K-进制数的数量。阅读完题目,或许应该考虑到解题的关键是如何确定其为一个有效数。结合题目的要求,有效数要不包含两个连续的0(当然,0也不能在开头),再结合已经学过的排列组合知识,即要求两个元素互不相邻,所以可以将问题转化为0的优先排列问题(也就是插空法),即先确定N位数字中0的具体位置,再将剩余位数按照K-进制的数字范围,取所有的非0数字即可。

注意事项:
1.在代码中,使用了两个变量 n 、 m 来分别标记 0 、 非0数 的数量情况,这里要注意 m + n 的和要始终等于总位数 N ,另外 0 的数量一定要小于等于 非0数 的数量,否则一定会出现非有效数的情况

2.在优先排列 0 时,要注意是组合问题,且每次当 m 改变时, 0 的可排列位数也在改变

参考代码:

#include<stdio.h>
#include<math.h>
int B_th(int m, int n, int K);
int Fac(int num);
int main()
{
	int N, K, sum = 0;
	scanf("%d %d", &N, &K);
	int m = N, n = 0;
	while(n <= m)
	{			
		sum += B_th(m, n, K);
		n++;
		m--;
	}
	printf("%d", sum);
	return 0;
}
int Fac(int num)
{
	if(num == 0)
	{
		return 1;
	}
	else
	{
		return (num * Fac(num - 1));
	}
}
int B_th(int m, int n, int K)
{
	int sum;
	sum = Fac(m) / Fac(m - n) / Fac(n) * pow((K - 1), m);
	return sum;
}


 

0.0分

4 人评分

看不懂代码?想转换其他语言的代码? 或者想问其他问题? 试试问问AI编程助手,随时响应你的问题:

编程语言转换

万能编程问答  

代码解释器

代码纠错

SQL生成与解释

  评论区