蓝桥杯之K好数问题

Posted ljbguanli

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了蓝桥杯之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好数问题的主要内容,如果未能解决你的问题,请参考以下文章

K好数(蓝桥杯 动态规划)

算法笔记_077:蓝桥杯练习 K好数(Java)

蓝桥杯 K好数

ALGO-3 Java K好数 蓝桥杯

蓝桥杯之算法模板题 Python版

蓝桥杯之数论专题