这题……noip普及组原题的数据规模1000,太简单了。这里被弄到了3000000……从oi到oj的提升哈~
先要解决算法的问题。很容易得出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;
![](/Images/OutliningIndicators/None.gif)
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;
}
先要解决算法的问题。很容易得出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内出解。
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](/Images/OutliningIndicators/None.gif)
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/ExpandedBlockEnd.gif)