背景
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 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原创。
感觉 要被这个题搞疯了
首先打表看看,前行有多少偶数,那么可以看出一些规律,,,,,
——————其实我并没有看出来什么规律,搜的oeis
然而那个公式把我搞疯了,,,,,,原文这样写的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.
然而序列是这样的:
0, 0, 1, 1, 4, 6, 9, 9, 16, 22, 29, 33, 42, 48, 55, 55, 70, 84, 99, 111, |
然后你会发现,a(2) = 0;
所以其实那个序列是错开一位的
也就是a(1)=a(2)=0, a(2n) = 3a(n)+n(n-1)/2, a(2n+1) = 2a(n)+a(n+1)+n(n+1)/2
十分尴尬,,,,,,,,
so
代码是这样的(有人用Python写着好简单,我java好复杂,,,,,):
import java.math.BigInteger;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class Main {
public static HashMap
map = new HashMap
();
public static BigInteger temp;
public static BigInteger two = BigInteger.valueOf(2);
public static BigInteger three = BigInteger.valueOf(3);
public static BigInteger fu = BigInteger.valueOf(-1);
public static void Solve(BigInteger n) {
if(map.get(n) != null) return;
if(n.mod(two).compareTo(BigInteger.ZERO) == 0) {
Solve(n.divide(two));
n = n.divide(two);
temp = n.multiply(n.subtract(BigInteger.ONE)).divide(two);
temp = map.get(n).multiply(three).add(temp);
map.put(n.multiply(two), temp);
}else {
n = n.divide(two);
Solve(n);
Solve(n.add(BigInteger.ONE));
temp = n.multiply(n.add(BigInteger.ONE)).divide(two);
temp = map.get(n).multiply(two).add(map.get(n.add(BigInteger.ONE))).add(temp);
map.put(n.multiply(two).add(BigInteger.ONE), temp);
}
}
public static void main(String[] args) {
Scanner Cin = new Scanner(System.in);
while(Cin.hasNext()) {
BigInteger n = Cin.nextBigInteger();
n = n.add(BigInteger.ONE);
BigInteger m = n;
map.put(BigInteger.ONE, BigInteger.ZERO);
map.put(BigInteger.ZERO,BigInteger.ZERO);
Solve(m);
System.out.println(map.get(n));
}
}
}
0, 0, 1, 1, 4, 6, 9, 9, 16, 22, 29, 33, 42, 48, 55, 55, 70, 84, 99, 111, |