题目
资源限制:
时间限制:1.0s 内存限制:256.0MB
问题描述:
如果一个自然数N的K进制表示中任意的相邻的两位都不是相邻的数字,那么我们就说这个数是K好数。求L位K进制数中K好数的数目。例如K = 4,L = 2的时候,所有K好数为11、13、20、22、30、31、33 共7个。由于这个数目很大,请你输出它对1000000007取模后的值。
输入格式:
输入包含两个正整数,K和L。
输出格式:
输出一个整数,表示答案对1000000007取模后的值。
样例输入:
4 2
样例输出:
7
数据规模与约定:
对于30%的数据,KL <= 106;
对于50%的数据,K <= 16, L <= 10;
对于100%的数据,1 <= K,L <= 100。
一、题目分析
k好数:一个K进制数,且其相邻两位不是相邻的数字(相差1);
本题目要求:L位K进制数中K好数的数目;
题目中给了2位4进制数中K好数的例子;
理解完K好数接下来便是对1000000007取模(求余—%);
取值范围:1<=K,L<=100;
二、解题思路
这里写了我的大概解题过程,有两个方法,都可以算出结果,写完第一种时间复杂度较高,提交会运行超时,不能让所有的测试数据通过;于是就出现了第二种。1.方法一(递归+累加)
总思路:依照题目的意思,即相邻的两位不能为连续的数字。- 从最高位开始(最高位不能为0)最高位可选K-1个数,即1 ~ K-1;
- 若最高位为i,则次高位,设置条件不能等于 i-1 或 i+1 ;
- 以此类推,直至运算值最后一位;
- 每算到最后一位,计数器Counter加1;
2.方法二
总思路:批量统计,最后累加,详细如下:- 初始化两个数组m1[],m2[],其中m1[]表示当前位上K进制中各个数字出现的次数,m2[]表示当前位的后一位各个数字出现的次数;
- 最高位中除了0之外1~K-1出现的次数均为1次,故初始化m1[],数组脚标及对应K进制数的各个数;
- 计算m2[],利用遍历m1[]中的0 ~ K-1,其中m2[i]等于m1[]中0 ~ K-1除了i-1和i+1的和;
- 对调,使m2[]表示当前位上K进制中各个数字出现的次数,m1[]表示当前位的后一位各个数字出现的次数;直到最后一位结束;
- 对最后得出的最后一位中K进制的各个数出现的次数进行累加,得出最后结果。
三、程序代码
1.方法一
#include<iostream>
using namespace std;
long long int K, L, C;
//第几位;数值大小;递归:计数器C符合条件的依次记录
void fun1(int a,int b) {
for (int i = 0; i < K; i++) {
if (i != b + 1 && i != b - 1) {
if (a != 2) {
fun1(a - 1, i);
}
else {
C++;
C=C%1000000007;
}
}
}
}
//K进制数;L位数;
int main() {
cin >> K >> L;
C = 0;
for (int i = 1; i < K; i++) {
fun1(L, i);
}
cout << C<<endl;
return 0;
}
2.方法二
#include<iostream>
using namespace std;
int K, L;
long long int m1[1000],m2[1000];
int i0;//fun
//根据进制数进行初始化
void fun_extra() {
i0 = L;
for (int i = 0; i < K; i++) {
if (i == 0) {
m1[i] = 0;
}
else {
m1[i] = 1;
}
m2[i] = 0;
}
}
void fun(long long int * m0_1, long long int *m0_2) {
for (int i = 0; i < K; i++) {
m0_2[i] = 0;
for (int j = 0; j < K; j++) {
if (j != i + 1 && j != i - 1) {
m0_2[i] += m0_1[j];
}
}
m0_2[i] %= 1000000007;
}
i0--;
if (i0 > 1) {
fun(m0_2, m0_1);
}
else {
long long int sum = 0;
for (int i = 0; i < K; i++) {
sum += m0_2[i];
}
cout<< sum % 1000000007;
}
}
//K进制数;L位数;
int main() {
cin >> K >> L;
fun_extra();
fun(m1, m2);
return 0;
}