HENUOJ部分蓝桥题目

01字串

对于长度为5位的一个01串,每一位都可能是0或1,一共有32种可能。它们的前几个是: 
00000 
00001 
00010 
00011 
00100 
请按从小到大的顺序输出这32种01串。

Input

本试题没有输入。

Output

输出32行,按从小到大的顺序每行一个长度为5的01串。

Examples

Input

Output

00000
00001
00010
00011
<以下部分省略>
Time limit 1 second
Memory limit 128 MB

采用模拟的方法,从末位往前修改,如果末位是0,改为1就行了,如果末位是1,把该位该为0,进行对前一位的修改,重复以上操作,五位一回车

以下代码:

#include<iostream>
using namespace std;
int main(){
	int a[6]={0};
	for(int k=1;k<=5;k++){
			cout<<a[k];
	}
	cout<<endl;
	for(int j=1;j<32;j++){
		for(int k=5;k>=0;k--){
			if(a[k]==1){
				a[k]=0;
				//k--;
				//cout<<"k="<<k<<' ';
			}
			else if(a[k]==0){
				a[k]=1;
				break;
			}
		}
		//cout<<"********"<<j<<"*******"<<endl; 
		for(int k=1;k<=5;k++){
			cout<<a[k];
		}
		cout<<endl; 
	}
}

 


Fibonacci数列

Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。 
当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少。

Input

输入包含一个整数n。

Output

输出一行,包含一个整数,表示Fn除以10007的余数

Examples

Input

10

Output

55

Input

22

Output

7704

Hint

说明:在本题中,答案是要求Fn除以10007的余数,因此我们只要能算出这个余数即可,而不需要先计算出Fn的准确值,再将计算的结果除以10007取余数,直接计算余数往往比先算出原数再取余简单。

数据规模与约定 
1 <= n <= 1,000,000。

Time limit 1 second
Memory limit 128 MB

这道题没有什么硬的问题,遇到的问题是如果要开一个很大的数组,需要将数组定义到主函数外面。

将数组声明为全局变量

以下代码:

#include<iostream>
using namespace std;
//int F(int n){
//	if(n==1||n==2){
//		return 1;
//	}else{
//		return F(n-1)+F(n-2);
//	}
//}
int f[1000010];
int main(){
	//cout<<"****"<<endl;
	f[1]=1;
	f[2]=1;
	for(int i=3;i<1000010;i++){
		f[i]=f[i-1]+f[i-2];
		f[i]%=10007;
	} 
	//cout<<"****"<<endl;
	int m;
	cin>>m;
	cout<<f[m]<<endl;
	return 0;
} 

FJ的字符串

 FJ在沙盘上写了这样一些字符串: 
 A1 = “A” 
 A2 = “ABA” 
 A3 = “ABACABA” 
 A4 = “ABACABADABACABA” 
 … … 
 你能找出其中的规律并写所有的数列AN吗?

Input

仅有一个数:N ≤ 26。

Output

请输出相应的字符串AN,以一个换行符结束。输出中不得含有多余的空格或换行、回车符。 

Examples

Input

3

Output

ABACABA

 这道题开始想的有点复杂,我想的是对字符数组进行操作,但是这样就得对字符数组进行粘贴啥的,有点麻烦。参考了一下别人的代码,用得是递归的思想,很简洁好懂,一分钟就能敲完

以下代码:

#include<iostream>
using namespace std;

string s(int n){
	if(n==1){
		return "A";
	}
	else{
		return s(n-1)+(char)('A'+n-1)+s(n-1);
	}
}

int main(){
	int m;
	cin>>m;
	cout<<s(m);
	return 0;
}

Hankson的趣味题

Hanks 博士是BT (Bio-Tech,生物技术) 领域的知名专家,他的儿子名叫Hankson。现 在,刚刚放学回家的Hankson 正在思考一个有趣的问题。 今天在课堂上,老师讲解了如何求两个正整数c1 和c2 的最大公约数和最小公倍数。现 在Hankson 认为自己已经熟练地掌握了这些知识,他开始思考一个“求公约数”和“求公 倍数”之类问题的“逆问题”,这个问题是这样的:已知正整数a0,a1,b0,b1,设某未知正整 数x 满足: 1. x 和a0 的最大公约数是a1; 2. x 和b0 的最小公倍数是b1。 Hankson 的“逆问题”就是求出满足条件的正整数x。但稍加思索之后,他发现这样的 x 并不唯一,甚至可能不存在。因此他转而开始考虑如何求解满足条件的x 的个数。请你帮 助他编程求解这个问题。

Input

输入第一行为一个正整数n,表示有n 组输入数据。 
接下来的n 行每 行一组输入数据,为四个正整数a0,a1,b0,b1,每两个整数之间用一个空格隔开。

输入 数据保证a0 能被a1 整除,b1 能被b0 整除。

Output

输出共n 行。每组输入数据的输出结果占一行,为一个整数。 
对于每组数据:若不存在这样的 x,请输出0; 若存在这样的 x,请输出满足条件的x 的个数; 

Examples

Input

2
41 1 96 288
95 1 37 1776

Output

6
2

Hint

样例说明 
第一组输入数据,x 可以是9、18、36、72、144、288,共有6 个。 
第二组输入数据,x 可以是48、1776,共有2 个。 

数据规模和约定 
对于 50%的数据,保证有1≤a0,a1,b0,b1≤10000 且n≤100。 
对于 100%的数据,保证有1≤a0,a1,b0,b1≤2,000,000,000 且n≤2000。 
 

C++那些细节--inline关键字
C++ inline函数简介
getchar用法

不知道怎么回事,这道题有点看不懂,先看其他的题吧


Huffuman树

 Huffman树在编码中有着广泛的应用。在这里,我们只关心Huffman树的构造过程。 
 给出一列数{pi}={p0, p1, …, pn-1},用这列数构造Huffman树的过程如下: 
 1. 找到{pi}中最小的两个数,设为pa和pb,将pa和pb从{pi}中删除掉,然后将它们的和加入到{pi}中。这个过程的费用记为pa + pb。 
 2. 重复步骤1,直到{pi}中只剩下一个数。 
 在上面的操作过程中,把所有的费用相加,就得到了构造Huffman树的总费用。 
 本题任务:对于给定的一个数列,现在请你求出用该数列构造Huffman树的总费用。 

 例如,对于数列{pi}={5, 3, 8, 2, 9},Huffman树的构造过程如下: 
 1. 找到{5, 3, 8, 2, 9}中最小的两个数,分别是2和3,从{pi}中删除它们并将和5加入,得到{5, 8, 9, 5},费用为5。 
 2. 找到{5, 8, 9, 5}中最小的两个数,分别是5和5,从{pi}中删除它们并将和10加入,得到{8, 9, 10},费用为10。 
 3. 找到{8, 9, 10}中最小的两个数,分别是8和9,从{pi}中删除它们并将和17加入,得到{10, 17},费用为17。 
 4. 找到{10, 17}中最小的两个数,分别是10和17,从{pi}中删除它们并将和27加入,得到{27},费用为27。 
 5. 现在,数列中只剩下一个数27,构造过程结束,总费用为5+10+17+27=59。 

Input

 输入的第一行包含一个正整数n(n<=100)。 
 接下来是n个正整数,表示p0, p1, …, pn-1,每个数不超过1000。 
 

Output

输出用这些数构造Huffman树的总费用。

Examples

Input

5
5 3 8 2 9

Output

59

这道题使用优先队列就可以了,从小到大排序,每次取出队列前两个数,相加之后再放入队列中(优先队列在最短路的迪杰斯特拉算法中也有使用)

以下代码:

#include<iostream>
#include<queue>
using namespace std;
int main(){
	priority_queue<int,vector<int>,greater<int> >p;
	int n;
	cin>>n;
	for(int i=0;i<n;i++){
		int m;
		cin>>m;
		p.push(m);
	}
	int sum=0;
	while(!p.empty()){
		int a,b,c;
		a=p.top();
		p.pop();
		if(p.empty()){
			//sum+=a;
			break;
		}
		b=p.top();
		p.pop();
		c=a+b;
		sum+=c;
//		cout<<c<<'*'<<endl;
//		cout<<sum<<'#'<<endl; 
		p.push(c);
	}
	cout<<sum<<endl;
} 

JAM计数法

 Jam是个喜欢标新立异的科学怪人。他不使用阿拉伯数字计数,而是使用小写英文字母计数,他觉得这样做,会使世界更加丰富多彩。在他的计数法中,每个数字的位数都是相同的(使用相同个数的字母),英文字母按原先的顺序,排在前面的字母小于排在它后面的字母。我们把这样的“数字”称为Jam数字。在Jam数字中,每个字母互不相同,而且从左到右是严格递增的。每次,Jam还指定使用字母的范围,例如,从2到10,表示只能使用{b,c,d,e,f,g,h,i,j}这些字母。如果再规定位数为5,那么,紧接在Jam数字“bdfij”之后的数字应该是“bdghi”。(如果我们用U、V依次表示Jam数字“bdfij”与“bdghi”,则U<V< span>,且不存在Jam数字P,使U<P<V< span>)。你的任务是:对于从文件读入的一个Jam数字,按顺序输出紧接在后面的5个Jam数字,如果后面没有那么多Jam数字,那么有几个就输出几个。 
 

Input

有2行,第1行为3个正整数,用一个空格隔开: 
 s t w 
 (其中s为所使用的最小的字母的序号,t为所使用的最大的字母的序号。w为数字的位数,这3个数满足:1≤s<T≤26, 2≤w≤t-s ) 
 第2行为具有w个小写字母的字符串,为一个符合要求的Jam数字。 
 所给的数据都是正确的,不必验证。

Output

最多为5行,为紧接在输入的Jam数字后面的5个Jam数字,如果后面没有那么多Jam数字,那么有几个就输出几个。每行只输出一个Jam数字,是由w个小写字母组成的字符串,不要有多余的空格。 
 

Examples

Input

2 10 5
bdfij

Output

bdghi
bdghj
bdgij
bdhij
befgh

对题目的解释:要求这一串字母中不能有重复的,且字母都是在给定区间内的,字母有大小之分

代码还不想写,以后补上


K好数

如果一个自然数N的K进制表示中任意的相邻的两位都不是相邻的数字,那么我们就说这个数是K好数。求L位K进制数中K好数的数目。例如K = 4,L = 2的时候,所有K好数为11、13、20、22、30、31、33 共7个。由于这个数目很大,请你输出它对1000000007取模后的值。 

Input

输入包含两个正整数,K和L。

Output

输出一个整数,表示答案对1000000007取模后的值。

Examples

Input

4 2

Output

7

Hint

数据规模与约定 
对于30%的数据,KL <= 106; 
对于50%的数据,K <= 16, L <= 10; 
对于100%的数据,1 <= K,L <= 100。

这道题需要注意的地方:首位不能为0,接下来的一位不能比上一位大一或小一,可以为它本身

这道题我觉得只需要找出一个函数的对应关系就能求解了。先来看第一位,不能为零,有n-1中情况,


K好数

如果一个自然数N的K进制表示中任意的相邻的两位都不是相邻的数字,那么我们就说这个数是K好数。求L位K进制数中K好数的数目。例如K = 4,L = 2的时候,所有K好数为11、13、20、22、30、31、33 共7个。由于这个数目很大,请你输出它对1000000007取模后的值。 

Input

输入包含两个正整数,K和L。

Output

输出一个整数,表示答案对1000000007取模后的值。

Examples

Input

4 2

Output

7

Hint

数据规模与约定 
对于30%的数据,KL <= 106; 
对于50%的数据,K <= 16, L <= 10; 
对于100%的数据,1 <= K,L <= 100。

这是一道动态规划的题,但是我动态规划掌握的还不太牢固 

参考代码:

#include<stdio.h>
#define mod 1000000007
int main() {
	int dp[110][110];
	int k,l;
	int i=0,j=0,m=0;
	scanf("%d%d",&k,&l);
	for(i=0;i<k;i++){
		dp[1][i]=1;
	}
	for(i=2;i<=l;i++){
		for(j=0;j<k;j++){
			for(m=0;m<k;m++){
				if(((m>j)?(m-j):(j-m))!=1){
					dp[i][j]=(dp[i][j]%mod+dp[i-1][m]%mod)%mod;
				}
			}
		}
	}
	int sum=0;
	for(i=1;i<k;i++){
		sum=(dp[l][i]%mod+sum%mod)%mod;
	}
	printf("%d\n",sum);
	return 0;
}

九宫重排

 如下面第一个图的九宫格中,放着 1~8 的数字卡片,还有一个格子空着。与空格子相邻的格子中的卡片可以移动到空格中。经过若干次移动,可以形成第二个图所示的局面。 
 

RequireFile.do?fid=qYebaGedRequireFile.do?fid=HQ3JFM72


 我们把第一个图的局面记为:12345678. 
 把第二个图的局面记为:123.46758 
 显然是按从上到下,从左到右的顺序记录数字,空格记为句点。 
 本题目的任务是已知九宫的初态和终态,求最少经过多少步的移动可以到达。如果无论多少步都无法到达,则输出-1。 
 

Input

输入第一行包含九宫的初态,第二行包含九宫的终态。

Output

输出最少的步数,如果不存在方案,则输出-1。

Examples

Input

12345678.
123.46758

Output

3

Input

13524678.
46758123.

Output

22

 需要注意的问题是如何记录每一种情况,还有就是如何判断这个情况出现过

 解决的办法是用哈希映射

https://blog.csdn.net/qq_34594236/article/details/64446491

猜你喜欢

转载自blog.csdn.net/Helloirbd/article/details/86675479