时间限制: 1Sec 内存限制: 128MB
题目描述
化学不及格的Matrix67无奈选择了文科。他必须硬着头皮准备一次又一次的文科考试。
在这一学期一共有n次文科考试,考试科目有4种,分别为政治、历史、地理和综合。每次考哪一科是不定的,因此在考试前Matrix67不知道应该 去复习哪一科的功课。他希望能预测出下一次可能考的科目。于是,他收集到了以往的文科考试的资料。从以往的考试中,他发现了这样几个规律:
1.如果这次考的是政治,那么下一次一定会考历史;
2.如果这次考的是综合,那么下一次一定会考地理;
3.如果这次考的是历史,那么下一次要么考政治,要么考地理;
4.如果这次考的是地理,那么下一次要么考历史,要么考综合。
Matrix67已经知道,本学期的第一次考试科目为政治。他打算拟定一个可以应对所有可能情况的应考复习计划。因此,他想知道,整个学期有多少种可能的考试科目安排满足以上规律。你能帮他算出来吗?
输入
一个正整数n,代表本学期总的考试次数。(输入数据保证n<=10000)
输出
一个正整数,表示符合规律的科目安排方案的总数。
考虑到这个结果可能会很大,因此你只需要输出它mod 7654321的值即可。
样例输入
5
样例输出
5
Code
Code: Queue --> 斐波那契数列
使用的是队列
化用代码:
政治 1 历史 2
地理 3 综合 4
1-->2 4-->3
2-->1/3 3-->2/4
-----------------n=5分布树---------------------------
1 1
2 2
3 1 3
4 2 2 4
5 1 3 1 3 3
一共有 12121 12123 12321 12323 12343五种情况
----------------队列的情况----------------------------
1 2 3 4 5 6 7 8 9 10 11 12
1 2 1 3 2 2 4 1 3 1 3 3
1 2 3 4 5
time 1 2 3 4 5
base 1 2 3 5 8
rear 2 3 5 8 13
----------------------枚举----------------------------
n time
1 1
2 1
3 2
4 3
5 5
6 8
7 13
----------------------规律----------------------------
a[n]=a[n-1]+a[n-2]
代码为:
#include<stdio.h>
#define INN 7654321
int ia[10001]={0,1,1,2};
int main()
{
int n,i;
scanf("%d", &n);
for(i=3;i<=n;i++){
ia[i]=(ia[i-1]+ia[i-2])%INN;
}
printf("%d\n", ia[n]);
}
使用队列测得前面多项的代码
#include<stdio.h>
#define INN 7654321
int queue[50000]={0};
int main()
{
int n=10,i,base,rear,front,cnt;
queue[1]=1;
base=1; rear=2; front=1;//初始化
for(i=1;i<n;i++){
base=rear;//当前最新的情况的结束位置
while(front<base){//将上一次产生的情况排列出来
if(queue[front]==1){
queue[rear++] = 2;
front++;
}
else if(queue[front]==2){
queue[rear++] = 1;
queue[rear++] = 3;
front++;
}
else if(queue[front]==3){
queue[rear++] = 2;
queue[rear++] = 4;
front++;
}
else if(queue[front]==4){
queue[rear++] = 3;
front++;
}
}//结束时,front=base,rear到达一个新的值,rear-1为当前情况的最后位置
cnt=rear-base;//当前的最后位置和上一次的最后位置之差
printf("%-2d: %d\n", i, cnt);
}
return 0;
}
傻逼的我把4的目标变为了1,而不是3,服了~~