Fancy Mouse
- -|||
这题……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;

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;
}
posted on 2005-10-22 01:42  Fancy Mouse  阅读(358)  评论(1编辑  收藏  举报