求三条边为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;
}