杨辉三角形

F. 杨辉三角形

Time Limit: 1500ms
Memory Limit: 65536KB
64-bit integer IO format: %lld      Java class name: Main
Submit Status PID: 4225

  

LZM 同学比较牛, Lsy 最近也越来越生猛,他们思路快,代码速度神勇。近期惊闻此二人均要参加校赛,队里决定出些题目卡他们,因为他们的罢工给题目组留下了繁重的负担……(报复报复)
于是, XsugarX 瞄准了 LZM 不太喜欢看的数学题目以及 Lsy 猜公式的喜好,奸笑中( ^.^ )。这个数学问题是个比较古老的问题,有如下图的三角形被称为杨辉三角形:
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
我们记第一个 1 为第 0 行,往下依次编号。
其中三角形左右两斜边上的数字均为 1 ,其他位置均为其两肩上的数之和。
此两牛看到偶数就会觉得复杂,被卡的时间与偶数的个数成正比, XsugarX 希望能卡他们的时间越久越好。
给定任意杨辉三角的行数 n ,请输出杨辉三角中 n 中总共有多少偶数。

Input

  

一个数 n 0<=n<=3,000,000 )。表示求杨辉三角前 n 行中偶数的个数。

Output

  

一个数 R 。表示在杨辉三角前 n 行中共有 R 个偶数,由于结果可能会很大,请输出 R mod 10,000,000 的结果。

Sample Input

4

Sample Output

4
 
 
 
 

这个题说是找偶数的规律,但结题报告里说奇数的规律更好看出来些 :杨辉三角的第n行中奇数个数等于2的k次方,k为n表示为二进制时一的个数。

然而我感觉这样更好理解    其中蓝色为奇数红色为偶数 三个蓝色三角形为相同的,中间的三角形为偶数,dp[1]表示第一行偶数的个数,规律为dp[i]=dp[i-x]*2+i-(i-x)*2;x表示当前i可满足的最大的2的几次方的值,i=5时,x=4;

 
 
 
 
#include<stdio.h>
 #include<string.h>
 #include<algorithm>
 using namespace std;
 const int MOD=10000000;
 int dp[3000010];
 int sum[3000010];
 void pp()
{
    dp[0]=0;
    dp[1]=0;
    dp[2]=0;
    dp[3]=1;
    dp[4]=0;
    int x=4;
    int i;
   for( i=5;i<=3000001;i++)
    {    dp[i]=dp[i-x]*2+i-(i-x)*2;//每一行的规律/
           dp[i]=dp[i]%MOD;
            if(i==x*2)   
                x=x*2;
    }
    sum[0]=0;
    for(i=0;i<=3000000;i++)//加和
        sum[i]=(dp[i+1]+sum[i-1])%MOD;
}
int main()
{pp();
    int n;
    while(~scanf("%d",&n))
    {
        printf("%d\n",sum[n]);
    }
}
</pre><pre class="cpp" name="code">/*1    --0  1
1 1  --1  2
1 2 1   --2 2
1 3 3 1   --3 4
1 4 6 4 1  --4 2
1 5 10 10 5 1 --5 6
1 6 15 20 15 6 1 --6 9
1 7 21 35 35 21 7 1 --7 9
*/
 

你可能感兴趣的:(杨辉三角形)