杨辉三角形蓝桥杯

杨辉三角形蓝桥杯_第1张图片

 

本题思路,其实就是对杨辉三角形的性质规律的应用,还是考察的是数学,就是杨辉三角第几斜行的数据其实是满足组合的性质C,通过这个就可以不用穷举储存,避免了时间空间超限的悲惨遭遇,但是依然需要优化,因为杨辉三角其实是一个对称的结构所以我们可以把他分成两部分,就看一半,且一个一个斜行的去看,使用二分优化查找不然不能过

可以参看:蓝桥杯2021年第十二届省赛-杨辉三角形_9898zy998的博客-CSDN博客_杨辉三角形蓝桥杯 

这个博客写的非常清楚

主要需要注意的是

第一点查找到这个数的位置在哪里 公式:n=qCx = (1+2+3+……+q)+x+1=(q+1)*q/2+x+1;

第二点注意求组合数的时候大于n时就可以直接返回,不然可能超过long的范围,部分测试点无法通过

代码如下

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;

public class Main杨辉三角形 {
	static int n;
	static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
	public static void main(String[] args) throws NumberFormatException, IOException {
		StreamTokenizer x = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
		x.nextToken();
		n=(int)x.nval;
		for(int i=14;i>=0;i--)
			if(check(i))
				return;
	}
	public static long C(int q,int k) {//求组合数
		long ans=1;
		for(int i=1,j=q-k+1;i<=k;i++,j++) {
			ans=ans*j/i;
			if(ans>n)return ans;//这里可能会溢出也就是可能会溢出long为防止溢出直接返回,不影响结果
		}
		return ans;
	}
	public static boolean check(int l) {//二分搜索,二分真的好用
		int beg=2*l,end=n;
		while(beg<=end) {//经典二分
			int mid=(beg+end)>>1;
	        long p=C(mid,l);//获取这个位置的数
			if(n>p)
				beg=mid+1;
			else if(n

如有侵权,联系删

你可能感兴趣的:(算法,java)