问题描述 如果一个自然数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。
解题过程中出现的错误:
1.第一次使用累加判断,然而其实是有规律可循(动态规划);
2.使用递归实现,当输入值较大时,时间超时;
3.动态数组没有初始化,使得累加过程会出现异常;
4.数值在累加存储过程中没有取余,产生错误数据;
总结:
1.判断是否有规律可循,忌直接下手实现简单的案例;
2.判断使用的方法(递归)是否会影响执行时间,从而做出更改;
正确代码:
1 #include <stdio.h> 2 #include <stdlib.h> 3 #define N 1000000007 4 5 int main(void) 6 { 7 int l = 0 , k = 0 ; 8 int i = 0 , j = 0 , x = 0 ; 9 int count = 0 ; 10 int *num ; 11 12 scanf("%d %d",&k,&l); 13 num = (int *)malloc(sizeof(int)*l*k); 14 15 for (i = 0 ; i < l*k ; i ++) 16 { 17 num[i] = 0; 18 } 19 for (i = 0 ; i < k ; i ++) 20 { 21 num[i] = 1; 22 } 23 24 for (i = 1 ; i < l ; i ++) 25 { 26 for (j = 0 ; j < k ; j ++) 27 { 28 for (x = 0 ; x < k ; x ++) 29 { 30 if (x != j - 1 && x != j + 1) 31 { 32 num[i*k + j] += num[(i-1)*k + x]; 33 num[i*k + j] %= N; 34 } 35 } 36 } 37 } 38 for (i = 1 ; i < k ; i ++) 39 { 40 count += num[(l-1)*k + i]; 41 count %= N; 42 } 43 printf("%d",count); 44 45 free(num); 46 num = NULL; 47 48 return 0; 49 }