试题链接
分治的方法:http://blog.csdn.net/acm_JL/article/details/50938164
根据分治的思想可以推导出递推式:f(k)=4*f(k-1)+1,且f(1)=1;
可知需要用到大数乘法和加法。
#include <iostream>
#include <cstring>
using namespace std;
int main()
{
int a[101][100];
memset(a,0,sizeof(a));
int tail=0; //指向最高位的索引
int value;
int carry=0;
a[1][0]=1;
for(int i=2; i<=100; i++)
{
for(int j=0; j<=tail; j++) //大数乘法 f(k-1)*4
{
value=a[i-1][j]*4+carry;
a[i][j]=value%10;
carry=value/10;
if(j==tail&&carry!=0)
tail++;
}//从此循环出来时carry一定为0
a[i][0]++; //加 1 操作
for(int n=0; n<=tail; n++)
{
if(a[i][n]<=9)
break;
else
{
value=a[i][n]+carry;
a[i][n]=value%10;
carry=1; //因为是加1操作,只可能进1位
}
if(n==tail&&carry!=0)
tail++;
}
}
//输出
int cnt,k;
cin>>cnt;
while(cnt--)
{
cin>>k;
if(k==1)
{
cout<<1<<endl;
continue;
}
int i=99;
while(a[k][i]==0)
i--;
for(int j=i; j>=0; j--)
cout<<a[k][j];
cout<<endl;
}
return 0;
}
优化:
1.可以用一维数组去替代二维数组
#include<iostream>
#include<cstring>
using namespace std;
int main()
{
int a[100]; //用一维数组去代替二维数组,优化空间复杂度
int n;
cin>>n;
while(n--)
{
memset(a,0,sizeof(a));
int k;
cin>>k;
if(k==1)
{
cout<<1<<endl;
continue;
}
a[0]=1;
int tail=0; //指向最高位的索引
int carry=0;
for(int i=2; i<=k; i++ )
{
for(int j=0; j<=tail; j++)
{
a[j]=a[j]*4+carry;
if(j==0)
a[j]++;
carry=a[j]/10;
a[j]=a[j]%10;
if(j==tail&&carry!=0)
tail++;
}//从此循环出来时carry一定为0
}
for(int i=tail; i>=0; i--)
cout<<a[i];
cout<<endl;
}
return 0;
}