#include <stdio.h>
#include <algorithm>
#include <cstring>
#include <iostream>
#include <stack>
using namespace std;
typedef long long ll;
const int N=4;
const ll base=1e4;
struct HP
{
private:
int len;ll a[200];//longlong一共占了8位字节,比int翻了一倍,所以数据量不需要太大
inline void clear(){
while(!a[len]&&len>1) len--;
}
public://public下面是冒号
void print()//print是内部函数,所以不需要引用
{
printf("%lld",a[len]);
for(int i=len-1;i>0;i--)//len已经输出,所以是len-1
for(int j=base/10;j>0;j/=10) printf("%lld",a[i]/j%10);//j负责压缩部分,%10用来取个位的部分
puts("");
}
HP &operator = (ll x)//赋值需要写引用 HP& operator
{
stack<char> q;string s;
if(!x) return *this ='0';//直接返回'0' 相当于将int转化成string类型再统一使用string的=来进行处理
while(x){q.push(x%10+'0');x/=10;}//注意转化成string类数字+‘0’
while(q.size())
{
s+=q.top();
q.pop();
}
return *this=s;
}
HP &operator = (const string &s)
{
HP res;
memset(a,0ll,sizeof(a));//需要清空
int l=s.length();//len提前赋值
for(int i=0;i<=l;i++)
{
int j=(l-i+(N-1))/N;//记忆:0开始的话刚好会落在数组的第一位 (1-0+3/4==1)
a[j]=(a[j]<<1)+(a[j]<<3)+(s[i]^48);//快读
}
len=(l+(N-1))/N;//同样的记忆法则(就不需要-了)
return *this;
}
HP operator + (const HP &x)
const {
HP res;res.len=max(len,x.len);ll k=0;//加乘除都需要用res来存储//len也要额外处理一下
for(int i=1;i<=res.len;i++)
{
res.a[i]=a[i]+x.a[i]+k;
k=res.a[i]/base;
res.a[i]%=base;
}
if(k>0) res.a[len+1]=k;//k要额外处理一下
return res;
}
HP operator -(const HP &x)
const {
HP res =*this;//直接拷贝回来(只有减)
for(int i=1;i<=len;i++)//从小到大减,这里被减数的len一定更大
{
res.a[i]-=x.a[i];
if(res.a[i]<0) res.a[i+1]--,res.a[i]+=base;
}
res.clear();
return res;
}
HP operator *(const ll &x)//乘单精度
const {
HP res;
for(int i=1;i<=len;i++) res.a[i]*=x;
for(int i=1;i<=len;i++) res.a[i+1]+=res.a[i]/base,res.a[i]%=base;
int &end=res.len;//用end来进行存储一下
while(res.a[end+1]>0) {end++;res.a[end+1]=res.a[end]/base,res.a[end]%=base;}
return res;
}
HP operator * (const HP &x)
const {
HP res;res.len=len+x.len;
for(int i=1;i<=len;i++)
for(int j=1;j<=x.len;j++)
{
res.a[i+j-1]=a[i]*x.a[j];
res.a[i+j]=res.a[i+j-1]/base;
res.a[i+j-1]%=base;
}
res.clear();
return res;
}
HP operator / (const ll &x)
const {
HP res;res.len=len;ll k=0ll;
for(int i=len;i>=1;i--)
{
k=k*base+a[i];
res.a[i]=k/x;
k%=x;
}
res.clear();
return res;
}
ll operator %(const ll &x)
const {
ll k=0ll;
for(int i=len;i>=1;i--)
{
k=k*base+a[i];
k%=x;//这里只关心k就好
}
return k;
}
bool operator >(const HP &x)
const {
if(len==x.len)
{
int i;
for(i=len;i>=1&&a[i]==x.a[i];i--);//消除i的影响,所以说后面的分号一定要记住
if(i>=1) return a[i]>x.a[i];
else return false;
}
return len>x.len;
}
bool operator <(const HP &x)// 返回值是bool类型
const {
if(len==x.len)
{
int i;
for(i=len;i>=1&&a[i]==x.a[i];i--);
if(i>=1) return a[i]<x.a[i];//>=¶¼ËµÃ÷¿ÉÒԼƽÏ
else return false;
}
return len<x.len;
}
};//这里需要有一个分号
HP max(const HP&a,const HP &b)
{
if(a>b) return a;
return b;
}
string sa,sb;
HP a,b,ans;
int main()
{
cin>>sa>>sb;
a=sa,b=sb;
a=3;
ans=a+b;
//printf("%d");
ans.print();
return 0;
}