第八题
问题描述
如果一个序列的奇数项都比前一项大,偶数项都比前一项小,则称为一个摆动序列。
即 a[2i]<a[2i-1], a[2i+1]>a[2i]。
小明想知道,长度为 m,每个数都是 1 到 n 之间的正整数的摆动序列一共有多少个。
输入格式
输入一行包含两个整数 m,n。
输出格式
输出一个整数,表示答案。答案可能很大,请输出答案除以10000的余数。
样例输入
3 4
样例输出
14
样例说明
以下是符合要求的摆动序列:
2 1 2
2 1 3
2 1 4
3 1 2
3 1 3
3 1 4
3 2 3
3 2 4
4 1 2
4 1 3
4 1 4
4 2 3
4 2 4
4 3 4
测试程序(非最后提交程序):
由于某些未知原因,每组数据都重复了四次
#include<stdio.h>
int g=0;
int m,n;
void judge(int a[]){
int i,j=0;
printf("%d ",a[0]);
for(i=1;i<m;i++){
printf("%d ",a[i]);
if(((i%2!=0)&&(a[i]>a[i-1]))||((i%2==0)&&(a[i]<a[i-1])))
j++;
}
printf("\n");
if(j==(m-1))
g++;
}
int swing(int k,int a[]){
k=k+1;
int i=1;
while(i<=n){
a[k]=i;
i++;
if(k==m)
judge(a);
else
swing(k,a);
}
return 0;
}
int main(){
int a[10];
int k=0,i,j;
scanf("%d%d",&m,&n);//长度为m,范围为1~n
for(i=1;i<=n;i++){
k=0;
a[k]=i;
swing(k,a);
}
printf("%d\n",(g/n)%10000);
return 0;
}
最后提交程序:(对大量数据运算不出来,程序仍需改进)
#include<stdio.h>
int g=0;
int m,n;
void judge(int a[]){
int i,j=0;
for(i=1;i<m;i++){
if(((i%2!=0)&&(a[i]>a[i-1]))||((i%2==0)&&(a[i]<a[i-1])))
j++;
}
if(j==(m-1))
g++;
}
int swing(int k,int a[]){
k=k+1;
int i=1;
while(i<=n){
a[k]=i;
i++;
if(k==m)
judge(a);
else
swing(k,a);
}
return 0;
}
int main(){
int a[10];
int k=0,i,j;
scanf("%d%d",&m,&n);//长度为m,范围为1~n
for(i=1;i<=n;i++){
k=0;
a[k]=i;
swing(k,a);
}
printf("%d",(g/n)%10000);
return 0;
}