2017-ICPC-沈阳-F Heron and His Triangle

题意:就是给你一个值n,要你找一个大于等于n的值t,且t-1,t,t+1构成的三角形面积为整数。

题解:

解法有两种:1.暴力打表找规律 2.用佩尔方程,这里我用的是佩尔方程。

由于已知三条边就可以用欧拉函数算出面积的公式。

S = \sqrt{3*(\frac{t}{2})^{2}*\left [ (\frac{t}{2})^{2}-1 \right ]}

看公式可以得出要让S为整数,(\frac{t}{2})^{2}-1必须等于3*{y^{2}}

得出(\frac{t}{2})^{2}-1 = 3*{y^{2}}

(\frac{t}{2})^{2}-3*{y^{2}} = 1

可以看出这个方程很像佩尔方程。

x = \frac{t}{2}

x^{2}-3*{y^{2}} = 1     d = 3

佩尔方程解的递推公式:

x^2-dy^2=1

x_n=x_{n-1}*x_1+d*y_{n-1}*y_1

y_n=x_{n-1}*y_1+y_{n-1}*x_1

由于数据过大就直接用java大数打了。

import java.math.BigInteger;
import java.util.Scanner;

public class Main {
	
	static BigInteger [] x=new BigInteger[1000];
	static BigInteger [] y=new BigInteger[1000];
	static BigInteger [] sum=new BigInteger[1000];
	static BigInteger d = BigInteger.valueOf(3);
	
	static void count() {
		x[1]=BigInteger.valueOf(2);
		y[1]=BigInteger.valueOf(1);
		sum[1]=BigInteger.valueOf(4);
		for(int i = 2 ; i < 200 ; i++) {
			x[i] = x[i-1].multiply(x[1]).add(d.multiply(y[i-1]).multiply(y[1]));
			y[i] = x[i-1].multiply(y[1]).add(y[i-1].multiply(x[1]));
			sum[i] = x[i].multiply(BigInteger.valueOf(2));
		}
	}
	
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		int T = input.nextInt();
		BigInteger n;
		count();
		while(T!=0) {
			T--;
			n = input.nextBigInteger();
			for(int i = 1 ; i < 200 ; i++) {
				if(n.compareTo(sum[i])!=1) {
					System.out.println(sum[i]);
					break;
				}
			}
		}
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值