尤拉計劃463題:奇怪的遞迴關係

lt發表於2017-03-23

奇怪的遞迴關係

定義在全體正整數上的函式f如下所示:

f(1)=1
f(3)=3
f(2n)=f(n)
f(4n+1)=2f(2n+1)−f(n)
f(4n+3)=3f(2n+1)−2f(n)
函式S(n)的定義是∑i=1nf(i)。

已知S(8)=22以及S(100)=3604。

求S(337)並給出其最後9位數字。

分析
手工給出f(1)-f(8)

 n  f(n)
-- ------
 1  1
 2  =f(1)=1
 3  3
 4  =f(2)=1
 5  =2f(3)-f(1)=5
 6  =f(3)=3
 7  =3f(3)-2f(1)=7
 8  =f(4)=1

測試程式

#include <cstdio>
int f[101]= {0};
int fo(int n)
{
    if (f[n]==0)
    {
        int m=n%4;
        switch(m)
        {
        case 0:
        case 2:
            f[n]=fo(n/2);
            break;
        case 1:
            f[n]=fo(n/2+1)*2-fo(n/4);
            break;
        case 3:
            f[n]=fo(n/2)*3-fo(n/4)*2;
            break;
        }
    }
    return f[n];
}
int main()
{
    f[1]=1;
    //f[2]=1;
    f[3]=3;
    //f[4]=1;
    int sum=0;
    for(int i=1; i<=100; i++)
        sum+=fo(i);
    printf("%d",sum);
}

輸出前幾個3i的值:

1 1
3 5
9 31
27 265
81 2415
243 20129
729 197671
2187 1680033
6561 15679899
19683 143488409
59049 1218975163
177147 11765456001
531441 95374906439
1594323 938756962769
4782969 8333085101983
14348907 73454816646585
43046721 693808156821983

相關文章