序列
解题思路
- 算法给的提示称暴力构造序列是求不出来的,当然我们也首先会排除这种做法。
- 在观察Sn的过程中会发现,任何Sn我们都可以将其平分为三个部分,左右两个部分是Sn-1,中间是Sn-1中所有序列+1,并且Sn的长度已知,是3的n-1次方,将其分为三个部分之后,第一部分的长度范围是(1, 3^(n-2)),第二部分为( 3^(n-2) +1,2*3^(n-2) ),第三部分为( 2 * 3^ (n-2) +1,3^(n-1)),基于此规律,可以递归算法求解。
代码
#include<stdio.h>
#include<math.h>
int fun(int n,int k){
if(n==1){ return 1; }
else{
int a=1; int b=pow(3,n-2); int c=b+1; int d=2*b;
int e=d+1; int f=pow(3,n-1);
if(k>=a && k<=b) return fun(n-1,k);
if(k>=c && k<=d) return fun(n-1,k-b)+1;
if(k>=e && k<=f) return fun(n-1,k-d);
}
}
int main()
{
int n,k;
int ans=0;
scanf("%d %d",&n,&k);
ans=fun(n,k);
printf("%d",ans);
return 0;
}