vijos - P1494杨辉三角形中的偶数个数 (递归分治 + 记忆化搜索 + python)

来源:互联网 发布:蚂蚁程序员 编辑:程序博客网 时间:2024/06/06 13:21
P1494杨辉三角形中的偶数个数
Accepted
标签:curimit[显示标签]

背景

curimit最近心情特别不好,尤其是看到偶数。

描述

某天,curimit在玩耍时,发现了一个纸头上画着一个杨辉三角形,心中感觉特不爽。

他认为偶数是导致他心中不爽的根本原因。并且有多少个偶数,他的不爽程度就为多少。

下面,请你算算curimit究竟有多不爽。

对杨辉三角形的说明:
1 1
1 2 1
1 3 3 1
1 4 6 4 1
。。。。。。。。。。。

形如上图的三角形称为杨辉三角形,而curimit看到的是这个三角形的前n行。

格式

输入格式

一行,一个n 。我们保证n小于50位。

输出格式

一行,curimit的不爽程度。

样例1

样例输入1[复制]

4

样例输出1[复制]

4

限制

1秒。。。。

提示

对样例的说明:
样例给出的三角形是:
1 1
1 2 1
1 3 3 1
1 4 6 4 1
这个4行的杨辉三角形中一共有4个偶数。

本题有很大难度,请认真思考。

对前5个点:每个点2分,n均小于100
对第6-10个点:每个点4分,n均小于10000
对第11-16个点:每个点5分,n均小于maxlongint
对第17-20个点:每个点10分,n均小于10^50

来源

curimit原创。

通过寻找规律,发现一下推导式:

a(0)=a(1)=0, a(2n) = 3a(n)+n(n-1)/2, a(2n+1) = 2a(n)+a(n+1)+n(n+1)/2


#!/usr/bin/env python3# -*- coding: utf-8 -*-L = {}def fun(m):    if L.get(m): return L[m]    n = int(m / 2);    if m < 2: return 0    else:        f = 0        if m % 2 :            f =  2 * fun(n) + fun(n + 1) + n * (n + 1) / 2;        else:            f =  3 * fun(n) + n * (n - 1) / 2;        L[m] = f    return fn = int(raw_input())print fun(n + 1)


0 0
原创粉丝点击