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

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 f
n = int(raw_input())
print fun(n + 1)


你可能感兴趣的:(vijos - P1494杨辉三角形中的偶数个数 (递归分治 + 记忆化搜索 + python))