蓝桥杯训练-K好数

问题描述

如果一个自然数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。


注:就是一个简单的01背包的问题,代码也很粗糙...题中需要注意的地方就是当L为1的时候,K进制中的每一个都是一个K好数,这样将数组第一行初始化完毕之后暴力DP就行了...因为测试数据不大,空间优化都没必要.




#include<iostream>

using namespace std;

long long dp[110][110];

int main(){
int k,l;
long long sum;
cin>>k>>l;
for(int i=0;i<110;i++)
dp[1][i] = 1;
//当L为1位的时候,每一个都是一个K好数
for(int i=2;i<=l;i++){
for(int j=0;j<k;j++){
sum = 0;
for(int m=0;m<k;m++){
if(m==(j-1)||m==(j+1)) continue;
sum += dp[i-1][m] ;
if(sum > 1000000007) sum%=1000000007;
}
dp[i][j] = sum;
}
}
sum = 0;
for(int j=1;j<k;j++){
sum += dp[l][j];
if(sum > 1000000007) sum%=1000000007;
}
cout<<sum<<endl;
return 0;
 }


猜你喜欢

转载自blog.csdn.net/lala__lailai/article/details/79232801
今日推荐