先要解决算法的问题。很容易得出f(x)的递推式f(0)+f(1)+f(2)+...+f(x/2)。但是,如果就照这个算的话,tle~~O(n^2)的复杂度,对于3000000的数据,能在1秒出解就……
于是要换个思路。我们计s(x)=f(0)+f(1)+...+f(x)。这样,f(x)=s(x/2)没有问题。计算s(x)的方法则是s(x) = s(x-1) + f(x) = s(x-1) + s(x/2)。这样我们成功的将计算一个函数值的复杂度从O(n)降到了O(1),总问题复杂度就是O(n),可以确保在1s内出解。
#include
<
iostream
>
#include < iomanip >
using namespace std;
long num[ 1500001 ][ 7 ];
void Init();
void Print( long number);
int main()
{
long number;
Init();
while(cin>>number)
{
number/=2;
Print(number);
}
return 0;
}
void Init()
{
long i,j,i_div_2,mem,length_i_1;
num[0][0] = num[0][1] = 1;
for(i=1;i<=1500000;i++)
{
i_div_2 = i>>1;
length_i_1 = num[i-1][0];
for(j=1;j<=length_i_1;j++)
{
mem = num[i][j] + num[i-1][j] + num[i_div_2][j];
num[i][j+1] = mem / 1000000000;
num[i][j] = mem % 1000000000;
}
if(mem < 1000000000) j--;
num[i][0] = j;
}
}
void Print( long number)
{
long k = num[number][0];
cout<<num[number][k];
while(k-- > 1)
{
cout.fill('0');
cout<<setw(9)<<num[number][k];
}
cout<<endl;
}
#include < iomanip >
using namespace std;
long num[ 1500001 ][ 7 ];
void Init();
void Print( long number);
int main()
{
long number;
Init();
while(cin>>number)
{
number/=2;
Print(number);
}
return 0;
}
void Init()
{
long i,j,i_div_2,mem,length_i_1;
num[0][0] = num[0][1] = 1;
for(i=1;i<=1500000;i++)
{
i_div_2 = i>>1;
length_i_1 = num[i-1][0];
for(j=1;j<=length_i_1;j++)
{
mem = num[i][j] + num[i-1][j] + num[i_div_2][j];
num[i][j+1] = mem / 1000000000;
num[i][j] = mem % 1000000000;
}
if(mem < 1000000000) j--;
num[i][0] = j;
}
}
void Print( long number)
{
long k = num[number][0];
cout<<num[number][k];
while(k-- > 1)
{
cout.fill('0');
cout<<setw(9)<<num[number][k];
}
cout<<endl;
}