hdu 6222 Heron and His Triangle

题目链接

求三条边为t,t-1,t+1,并且面积为整数,最后满足t大于等于n的最小的t值。

先暴力打表

void init(){  //暴力打表 
	for(ll i=2;i<=1e30;i++){
		if((i-1)+i>(i+1)){
			double m=double(3.0*i/2);
			double d=sqrt(m*(m-i+1)*(m-i)*(m-i-1));
			
			if(d==int(d)){
//				printf("%lld %lld %lld %lf\n",i-1,i,i+1,d);	
				printf("%lld\n",i);
			}
					
		}
			
	}
}

再利用高斯消元得出 f(n) = 4f(n-1) - f(n-2) ;  直接利用大数求解,设第0个是2;

java求法:

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

public class  Main{

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int t = sc.nextInt();
        for(int i=1;i<=t;i++) 
        {
            BigInteger a = sc.nextBigInteger();
            BigInteger b = new BigInteger("2");  //第0个
            BigInteger c = new BigInteger("4");  //第一个
            BigInteger d;
            BigInteger k = new BigInteger("4");
            while(c.compareTo(a)<0)
            {
                d=k.multiply(c).subtract(b);
                b=c;
                c=d;
            }
            System.out.println(c);
        }
    }
}

C++求法:

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
typedef unsigned long long ll;
string f[200+1];

bool compare(string s1,string s2)
{
    if(s1.size()>s2.size())//s1>s2
        return true;
    else if(s1.size()<s2.size())//s2>s1
        return false;
    else
        return s1>s2;
}
string Mult(string s,int x)  //大数乘以整形数
{
    reverse(s.begin(),s.end());
    int cmp=0;
    for(int i=0;i<s.size();i++)
    {
        cmp=(s[i]-'0')*x+cmp;
        s[i]=(cmp%10+'0');
        cmp/=10;
    }
    while(cmp)
    {
        s+=(cmp%10+'0');
        cmp/=10;
    }
    reverse(s.begin(),s.end());
    return s;
}

string sub(string a,string b)
{
    string c;
    bool ok=0;
    int len1=a.length();
    int len2=b.length();
    int len=max(len1,len2);
    for(int i=len1;i<len;i++)
        a="0"+a;
    for(int i=len2;i<len;i++)
        b="0"+b;
    if(a<b)
    {
        string temp=a;
        a=b;
        b=temp;
        ok=1;
    }
    for(int i=len-1;i>=0;i--)
    {
        if(a[i]<b[i]) 
        {
            a[i-1]-=1;
            a[i]+=10;
        }
        char temp=a[i]-b[i]+'0';
        c=temp+c;
    }
    int pos=0;
    while(c[pos]=='0' && pos<len) pos++;
    if(pos==len) return "0"; 
    if(ok) return "-"+c.substr(pos);
    return c.substr(pos);
}

int main()
{
	
	f[1]="4",f[2]="14";
	for(int i=3;i<200;i++){
		f[i]=sub(Mult(f[i-1],4),f[i-2]);
	}
	int t;
	string s;
	while(cin>>t)
	{
		while(t--)
		{
			cin>>s;
			for(int i=200-1;i>=0;i--)

				if(compare(s,f[i]))//s大于f输出
				{
					cout<<f[i+1]<<endl;
					break;
				}
				else if(f[i]==s)
				{
					cout<<f[i]<<endl;
					break;
				}

		}
	}
	return 0;
}

猜你喜欢

转载自blog.csdn.net/lidengdengter/article/details/81137740
今日推荐