首页 > 代码库 > 蓝桥杯之K好数问题

蓝桥杯之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。

分析:刚開始我是认为能够通过全排列出全部情况在筛选掉数字相邻之后来求解本问题的,但我发现,不反复挑选l个数字是一个难点。因为l最大到100,也就是说最多可能须要100+个循环来挑选组合数字。之后,我发现相邻进制之间存在着数据联系,第i位数放置j所得到的全部K好数由i-1进制数的全部K好数之和去除与j相邻的两种情况求得。

依照这样的思路,考虑用DP解答。

代码例如以下:

#include<iostream>
#include<algorithm>
using namespace std;
long long d[105][105];
const int INF = 1000000007;
long long sum;
int main()
{
	int k,l,i,j,t;
	cin>>k>>l;
	for(j=0;j<k;j++)
	d[1][j]=1;
	for(i=2;i<=l;i++)
	for(j=0;j<k;j++)
	for(t=0;t<k;t++)
	if(t!=j-1&&t!=j+1)
	{
		d[i][j]+=d[i-1][t];
		d[i][j]%=INF;
	}
	sum=0;
	for(j=1;j<k;j++)
	{
	sum+=d[l][j];
	sum%=INF;
	}
	cout<<sum<<endl;
	return 0;
}


蓝桥杯之K好数问题