Heron and His Triangle HDU - 6222

2018TYUT暑期ACM模拟赛(4)
Heron and His Triangle HDU - 6222
思路:找到规律,高斯消元,得到递推式f(n)=4*f(n-1)-f(n-2)。因为会很大很大,所以用到了大数。里面的递推计算都是大数里面的。高斯消元和大数模板在本博客的模板里面都有。
ps:懒惰了几天在这里玩,想想自己还是只是每次也就过了水题,哎—_—.

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
typedef unsigned long long ll;
string f[200+1];
string Except(string s,int x)  //大数除以整形数
{
    int cmp=0,ok=0;
    string ans="";
    for(int i=0;i<s.size();i++)
    {
        cmp=(cmp*10+s[i]-'0');
        if(cmp>=x)
        {
            ok=1;
            ans+=(cmp/x+'0');
            cmp%=x;
        }
        else{
            if(ok==1)
                ans+='0';  //注意这里啊。才找出错误
        }
    }
    return ans;
}
//大数相加
string sum(string s1,string s2)
{
    if(s1.length()<s2.length())
    {
        string temp=s1;
        s1=s2;
        s2=temp;
    }
    int i,j;
    for(i=s1.length()-1,j=s2.length()-1;i>=0;i--,j--)
    {
        s1[i]=char(s1[i]+(j>=0?s2[j]-'0':0));   //注意细节
        if(s1[i]-'0'>=10)
        {
            s1[i]=char((s1[i]-'0')%10+'0');
            if(i) s1[i-1]++;
            else s1='1'+s1;
        }
    }
    return s1;
}
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 Multfa(string x,string y)  //大数乘法
{
    string ans;
    for(int i=y.size()-1,j=0;i>=0;i--,j++)
    {
        string tmp=Mult(x,y[i]-'0');
        for(int k=0;k<j;k++)
            tmp+='0';
        ans=sum(ans,tmp);
    }
    return ans;
}
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]);
        //cout<<f[i]<<endl;
    }
    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/miranda_ymz/article/details/81137401
今日推荐