4112: 杨辉三角

内存限制:128 MB 时间限制:1.000 S
评测方式:文本比较 命题人:
提交:6 解决:6

题目描述

杨辉三角就是一个用数排列起来的三角形(如下图),杨辉三角规则如下:

1)每行第一个数和最后一个数都为1,其它每个数等于它左上方和右上方的两数之和;

2)第n行有n个数。

注意:“列”指的是如图所标注的斜列。


编程实现:

小青对杨辉三角的特点和规律研究得很明白,现要考察你对杨辉三角的熟悉程度,首先告知你这是一个N行的杨辉三角,然后又告知了两个数值X和Y(X表示第几行,Y表示第几列),让你根据杨辉三角的特点和观察到的规律解决以下两个问题。

1)第X行第Y列对应的数是多少;

2)求出N行的杨辉三角中第Y列中所有数的和。

例如:N=5,5行的杨辉三角如下图:


X=5,Y=3,第5行第3列对应的数为6;第3列中所有数的和为10(10 = 6 + 3 + 1)。


输入

第一行输入一个正整数N(2≤N≤30),表示杨辉三角的行数。

第二行输入两个正整数X和Y(1≤Y≤X≤N),分别表示第X行和第Y列,正整数之间以一个英文逗号隔开

输出

输出两个整数,分别表示N行的杨辉三角中第X行Y列对应的数,及第Y列上所有数的和,两个整数之间以一个英文逗号隔开

样例输入 复制

5
5,3

样例输出 复制

6,10

提示

本题的题目里其实提示的已经很清晰了,用二维列表来储存杨辉三角形,唯一的难点在于找出生成杨辉三角形的规律。

这个规律是:二维列表中第[i][j]个数的值等于第[i-1][j-1]个数的值与第[i-1][j]个数的值之和。

我们依据这个规律就可以生成杨辉三角形,有了三角形之后,需要找三角形中的某个数,或某列之和就很简单了。

n=int(input())
X,Y = list(map(int, input().split(',')))
a=[[0]*n for _ in range(n)]  #初始化所有数为0
for i in range(n):  #初始化第1列和对角线为1
    a[i][0]=a[i][i]=1
for i in range(2,n):  #从第3行第2列开始填充数值
    for j in range(1,i):
        a[i][j]=a[i-1][j]+a[i-1][j-1]

# 输出第X行Y列对应的数
num = a[X-1][Y-1]
# 计算第Y列上所有数的和
col_sum=0
for i in range(n):
    col_sum+=a[i][Y-1]
print(num, col_sum, sep=",")