Решение задачи №363 «Длинное произведение» с ACMP





Решение задачи №363 «Длинное произведение» с ACMP

Условие задачи

Даны целые неотрицательные числа M и N. Требуется найти произведение этих чисел.

Входные данные
Входной файл INPUT.TXT содержит в первой строке число M, а во второй строке – число N. (0 ≤ M, N ≤ 102500)

Выходные данные
В выходной файл OUTPUT.TXT выведите произведение чисел M и N.

#include<iostream>
#include<iomanip>
#include<string>
#include<vector>
#define PB push_back
#define ll long long
using namespace std;
typedef vector<int> lll;
const long long e=1000000000, k=9;

istream& operator >>(istream& stream,lll& a){
string s,r; stream>>s;
for(int i=s.size();i>0;i-=k){
int j=i-k;
if(j>=0)r=s.substr(j,k); else r=s.substr(0,i);
a.PB(stoi(r));}
return stream;
}
ostream& operator <<(ostream& stream,lll a){
stream<<a[a.size()-1];
for(int i=a.size()-2;i>=0;--i)stream<<setw(9)<<setfill('0')<<a[i];
return stream;}
bool operator >(lll a,lll b){
if(a.size()>b.size())return true;
if(a.size()<b.size())return false;
for(int i=a.size()-1;i>=0;--i){
if(a[i]>b[i])return true;
if(a[i]<b[i])return false;}
return false;}
lll operator +(lll a,lll b){
lll c;
int i,r=0;
if(a.size()<b.size())swap(a,b);
for(i=0;i<a.size();i++){
if(i<a.size())r+=a[i];
if(i<b.size())r+=b[i];
c.push_back(r%e);
r/=e;
}
if(r) c.push_back(r);
return c;}
lll operator -(lll a,lll b){
lll c;int i,r=0;
for(i=0;i<a.size();++i){
r+=a[i];
if(i<b.size())r-=b[i];
if(r<0){c.PB(r+10);r=-1;}
else{c.PB(r%10);r=0;}}
while(c.size()>1&&c.back()==0)c.pop_back();
return c;}

lll operator *(lll a,ll b){
lll c;int i;ll r=0;
if(b==0){c.PB(0);return c;}
for(i=0;i<a.size();++i){
r+=a[i]*b;
c.PB(r%e);r/=e;}
while(r){c.PB(r%e);r/=e;}
return c;}


lll operator *(lll a,lll b){
lll c,d(1,0);int i,j;
if(a==d||b==d)return d;
if(b.size()>a.size())swap(a,b);
for(i=0;i<b.size();++i){
c=a*b[i];
for(j=0;j<i;j++)c.insert(c.begin(),0);
d=d+c;}
return d;}
ll operator % (lll a,ll b) {
lll c;
int i;
ll r=0,t;
for(i=a.size()-1;i>=0;i--){
r=r*10+a[i];
t=r/b;
r-=t*b;
}
return r;
}
lll operator /(lll a,ll b){
lll c;
int i;
ll r=0,t;
for(i=a.size()-1;i>=0;i--){
r=r*10+a[i];
t=r/b;
c.insert(c.begin(),t);
r-=t*b;
}
while(c.size()>1&&c[c.size()-1]==0)
c.resize(c.size()-1);
return c;
}


int main()
{
lll a,b;
cin>>a>>b;
cout<<a*b;
}



Условия задач взяты с сайта acmp.ru