蓝桥杯之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;
}
时间: 2024-12-14 18:40:46

蓝桥杯之K好数问题的相关文章

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

目录 1 问题描述 2 解决方案   1 问题描述 问题描述 如果一个自然数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 数据规模与约定

2014蓝桥杯——六角填数

标题:六角填数 如图所示六角形中,填入1~12的数字. 使得每条直线上的数字之和都相同. 图中,已经替你填好了3个数字,请你计算星号位置所代表的数字是多少? 请通过浏览器提交答案,不要填写多余的内容. 1 #include <iostream> 2 #include <cmath> 3 #include <cstdio> 4 #include <cstring> 5 using namespace std; 6 7 #define eps 10e-10 8

蓝桥杯_基础训练_数的读法

有点恶心的一道题,做了整整半天才完全对. 思路: 把输入的数从右往左每4位进行分割.然后判断单位级数,输出即可. #include <iostream> #include <cstring> #include <algorithm> using namespace std; int main() { string a; string num[]={"ling ","yi ","er ","san &q

蓝桥杯 - 连号区间数

历届试题 连号区间数 时间限制:1.0s   内存限制:256.0MB 锦囊1 并查集. 锦囊2 从左到右扫描数组,将所有扫描到的数放到并查集中,将相邻的数在集合中合并.对于每个合并的集合记录下递增可连的次数和递减可连的次数以及数字出现的最早和最晚时刻.当新扫描的数过来时根据以上几个值来合并区间并维护. 问题描述 小明这些天一直在思考这样一个奇怪而有趣的问题: 在1~N的某个全排列中有多少个连号区间呢?这里所说的连号区间的定义是: 如果区间[L, R] 里的所有元素(即此排列的第L个到第R个元素

蓝桥杯 - 连号区间数 (历届试题!)

连号区间数 时间限制:1.0s   内存限制:256.0MB 问题描述 小明这些天一直在思考这样一个奇怪而有趣的问题: 在1~N的某个全排列中有多少个连号区间呢?这里所说的连号区间的定义是: 如果区间[L, R] 里的所有元素(即此排列的第L个到第R个元素)递增排序后能得到一个长度为R-L+1的"连续"数列,则称这个区间连号区间. 当N很小的时候,小明可以很快地算出答案,但是当N变大的时候,问题就不是那么简单了,现在小明需要你的帮助. 输入格式 第一行是一个正整数N (1 <=

蓝桥杯 - 特殊回文数

特殊回文数 时间限制:1.0s   内存限制:512.0MB 问题描述 123321是一个非常特殊的数,它从左边读和从右边读是一样的. 输入一个正整数n, 编程求所有这样的五位和六位十进制数,满足各位数字之和等于n . 输入格式 输入一行,包含一个正整数n. 输出格式 按从小到大的顺序输出满足条件的整数,每个整数占一行. 样例输入 52 样例输出 899998 989989 998899 数据规模和约定 1<=n<=54. 和之前那个一样.. AC代码: #include <cstdio

蓝桥杯 ALGO-93 反置数(数学、函数)

[思路]:atoi和itoa的使用,注意atoi,三个参数.第一个是要转换的数,第二个是保存在那个字符串中,第三个是什么进制. [AC代码]: #include <iostream> #include <algorithm> #include <string> #include <cstdio> #include <cstring> using namespace std; #define MAX 20+2 int reverse_num(int

蓝桥杯 K好数(DP)

本文出自:http://blog.csdn.net/svitter 算法训练 K好数 时间限制: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. 输出格式 输出一个整数,表示答案

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