P1255
HighPerformanceRobot
2019-02-13 17:51:21
--------------------------------
好奇为什么难度是普及-,,,这种"高精+n"不是至少应该普及的吗..
-----------------------------------吐槽分割线-------------------------
今天我给大家带来了高精模板,大家随便借鉴哈,顺便推广一下本人的自己写的头文件:
更全的高精模板?从SHORT到LONG_LONG?
更多的函数?~~(好吧其实很少)~~
敬请关注:[我的blog !](https://ymxismylove.blog.luogu.org/stdafxh-v10-post)
------------
思路很简单,模拟过程罢了.
上代码:
```cpp
#include<bits/stdc++.h>
//#include<stdafx>
using namespace std;
class LONG_LONG
{
protected:
int number[10240];
int len;
bool flag;
public:
LONG_LONG()
{
fill(number,number+10240,0);
len=1,flag=1;
}
LONG_LONG(int num)
{
*this=num;
}
LONG_LONG(char* num)
{
*this=num;
}
void count()
{
while(len>1&&!number[len-1])
len--;
}
LONG_LONG operator=(const char* num)
{
fill(number,number+10240,0);
char now[10240]="";
if(num[0]!='-')
strcpy(now,num);
else
for(int i=1,lon=strlen(num); i<lon; i++)
now[i-1]=num[i];
flag=!(num[0]=='-');
len=strlen(now);
for(int i=0; i<len; i++)
number[i]=now[len-i-1]-'0';
return *this;
}
LONG_LONG operator=(int num)
{
num<0?flag=0,num=-num:flag=1;
char temp[10241];
sprintf(temp,"%d",num);
*this=temp;
return *this;
}
LONG_LONG operator=(const string num)
{
const char* temp;
temp=num.c_str();
*this=temp;
return *this;
}
LONG_LONG operator+(const LONG_LONG& num)const
{
if(flag^num.flag)
{
LONG_LONG tmp=flag?num:*this;
tmp.flag=1;
return flag?*this-tmp:num-tmp;
}
LONG_LONG res;
res.len=0;
for(int i=0,temp=0; temp||i<(max(len,num.len)); i++)
{
int t=number[i]+num.number[i]+temp;
res.number[res.len++]=t%10;
temp=t/10;
}
res.flag=flag;
return res;
}
LONG_LONG operator-(const LONG_LONG& num)const
{
LONG_LONG nowb=num,nowa=*this;
if(!num.flag&&!flag)
{
nowb.flag=nowa.flag=1;
return nowb-nowa;
}
if(!nowb.flag)
{
nowb.flag=1;
return nowa+nowb;
}
if(!nowa.flag)
{
nowa.flag=1;
nowb=LONG_LONG(0)-(nowa+nowb);
return nowb;
}
if(nowa<nowb)
{
LONG_LONG nowc=(nowb-nowa);
nowc.flag=false;
return nowc;
}
LONG_LONG res;
res.len=0;
for(int i=0,g=0; i<nowa.len; i++)
{
int now=nowa.number[i]-g;
if(i<nowb.len)
now-=nowb.number[i];
now>=0?g=0:g=1,now+=10;
res.number[res.len++]=now;
}
res.count();
return res;
}
LONG_LONG operator*(const int& num)const
{
LONG_LONG nowa=num,nowb=*this;
return nowa*nowb;
}
LONG_LONG operator*(const LONG_LONG& num)const
{
LONG_LONG res;
res.len=len+num.len;
for(int i=0; i<len; i++)
for(int j=0; j<num.len; j++)
res.number[i+j]+=number[i]*num.number[j];
for(int i=0; i<res.len; i++)
{
res.number[i+1]+=res.number[i]/10;
res.number[i]%=10;
}
res.count();
res.flag=!(flag^num.flag);
return res;
}
LONG_LONG operator/(const LONG_LONG& num)const
{
LONG_LONG res;
res.len=len-num.len+1;
if(res.len<0)
{
res.len=1;
return res;
}
LONG_LONG div_1=*this,div_2=num;
div_1.flag=div_2.flag=1;
int nowflag=res.len-1,nowflag2=len-1;
while(nowflag>=0)
{
while(div_1.number[nowflag2]==0)
nowflag2--;
if(nowflag>nowflag2)
nowflag=nowflag2;
char z[10241];
fill(z,z+10241,0);
for(int i=nowflag2; i>=nowflag; i--)
z[nowflag2-i]=div_1.number[i]+'0';
LONG_LONG div_3=z;
if(div_3<div_2)
{
nowflag--;
continue;
}
int key=0;
while(div_2*key<=div_3)
key++;
key--;
res.number[nowflag]=key;
LONG_LONG temp=div_2*key;
for(int i=0; i<nowflag; i++)
temp=temp*10;
div_1=div_1-temp;
nowflag--;
}
res.count();
res.flag=!(flag^num.flag);
return res;
}
LONG_LONG operator%(const LONG_LONG& num)const
{
LONG_LONG nowa=*this,nowb=num;
nowa.flag=nowb.flag=1;
LONG_LONG res,temp=nowa/nowb*nowb;
res=nowa-temp;
res.flag=flag;
return res;
}
LONG_LONG operator+=(const LONG_LONG& num)
{
*this=*this+num;
return *this;
}
LONG_LONG operator-=(const LONG_LONG& num)
{
*this=*this-num;
return *this;
}
LONG_LONG operator*=(const LONG_LONG& num)
{
*this=*this*num;
return *this;
}
LONG_LONG operator/=(const LONG_LONG& num)
{
*this=*this/num;
return *this;
}
LONG_LONG operator++()
{
*this=*this+1;
return *this;
}
LONG_LONG operator++(int)
{
LONG_LONG old=*this;
++(*this);
return old;
}
LONG_LONG operator--()
{
*this=*this-1;
return *this;
}
LONG_LONG operator--(int)
{
LONG_LONG old=*this;
--(*this);
return old;
}
bool operator<(const LONG_LONG& num)const
{
if(flag^num.flag)
return num.flag;
if(len!=num.len)
return len<num.len;
for(int i=len-1; i>=0; i--)
if(number[i]!=num.number[i])
return flag?(number[i]<num.number[i]):(!(number[i]<num.number[i]));
return !flag;
}
bool operator>(const LONG_LONG& num)const
{
return num<*this;
}
bool operator<=(const LONG_LONG& num)const
{
return !(*this>num);
}
bool operator>=(const LONG_LONG& num)const
{
return !(*this<num);
}
bool operator==(const LONG_LONG& num)const
{
return !(num!=*this);
}
bool operator!=(const LONG_LONG& num)const
{
return *this>num||*this<num;
}
bool operator!()const
{
return *this==1?0:1;
}
string str()const
{
string res="";
for(int i=0; i<len; i++)
res=static_cast<char>(number[i]+'0')+res;
if(res=="")
res="0";
if(!flag&&res!="0")
res="-"+res;
return res;
}
};
istream& operator>>(istream &in,LONG_LONG &f)
{
string s;
in>>s;
f=s.c_str();
return in;
}
ostream& operator<<(ostream &out,const LONG_LONG &f)
{
out<<f.str();
return out;
}
LONG_LONG a=1,b=1,c,n;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cin>>n;
if(n==0)
{
cout<<0<<endl;
return 0;
}
for(LONG_LONG i=1; i<n; i++)
{
c=b;
b+=a;
a=c;
}
cout<<b<<endl;
return 0;
}
```