您的位置:首页 > 其它

杨辉三角形【找规律】

2016-04-08 21:24 260 查看


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
[align=center]1 5 10 10 5 1[/align]
我们记第一个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


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

然而我感觉这样更好理解    其中蓝色为奇数红色为偶数 三个蓝色三角形为相同的,中间的三角形为偶数,dp[1]表示第一行偶数的个数,规律为dp[i]=dp[i-x]*+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
);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: