#include<bits/stdc++.h>
#define fs first
#define sc second
#define pb push_back
using namespace std;
typedef unsigned int ui;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
struct dsu{
public:
dsu()=delete;
dsu(int _n):n(_n),f(_n+1,-1){}
int merge(int a,int b){int x=find(a),y=find(b);if(x==y)return x;if(-f[x]<-f[y])swap(x,y);return f[x]+=f[y],f[y]=x;}
bool same(int x,int y){return find(x)==find(y);}
int find(int x){if(f[x]<0)return x;return f[x]=find(f[x]);}
int size(int x){return -f[find(x)];}
private:
int n;
vector<int>f;
};
template<class T>struct BIT{
public:
BIT()=delete;
BIT(int _n):n(_n),f(_n+1){};
void add(int p,T x){while(p<=n){f[p]+=x;p+=p&-p;}}
T sum(int p){T s=0;while(p>0){s+=f[p];p-=p&-p;}return s;}
T sum(int l,int r){return sum(r)-sum(l-1);}
private:
int n;
vector<T>f;
};
namespace math{
constexpr ll smod(ll x,ll m)noexcept{x%=m;if(x<0)x+=m;return x;}
constexpr ll qmi(ll x,ll n,int m){if(m==1)return 0;ui _m=static_cast<ui>(m);ull r=1,y=smod(x,m);while(n){if(n&1)r=(r*y)%_m;y=(y*y)%_m;n>>=1;}return static_cast<ll>(r);}
constexpr bool isprime(int n)noexcept{if(n<=1)return 0;if(n==2||n==7||n==61)return 1;if(n%2==0)return 0;ll d=n-1;while(d%2==0)d/=2;constexpr ll b[3]={2,7,61};for(ll a:b){ll t=d;ll y=qmi(a,t,n);while(t!=n-1&&y!=1&&y!=n-1){y=(y*y)%n;t<<=1;}if(y!=n-1&&t%2==0)return 0;}return 1;}
constexpr pair<ll,ll>invgcd(ll a,ll b){a=smod(a,b);if(a==0)return {b,0};ll s=b,t=a,m0=0,m1=1;while(t){ll u=s/t;s-=t*u,m0-=m1*u;swap(s,t),swap(m0,m1);}if(m0<0)m0+=b/s;return {s,m0};}
constexpr ll invmod(ll x,ll m){return invgcd(x,m).sc;}
int ceilpow2(int n)noexcept{if(n<=1)return 0;return 32-__builtin_clz(n-1);}
int bsf(ui n){return __builtin_ctz(n);}
};
struct barrett{
ui _m;ull im;
barrett(ui m):_m(m),im((ull)(-1)/m+1){}
ui umod()const{return _m;}
ui mul(ui a,ui b)const{ull z=a;z*=b;ull x=(ull)(((unsigned __int128)(z)*im)>>64);ui v=(ui)(z-x*_m);if(_m<=v)v+=_m;return v;}
};
template<int m>struct static_modint{
using mint=static_modint;
static constexpr int mod()noexcept{return m;}
static constexpr ui umod()noexcept{return static_cast<ui>(m);}
static constexpr bool prime=math::isprime(m);
static mint raw(int v)noexcept{mint x;x._v=static_cast<ui>(v);return x;}
static_modint()noexcept:_v(0){}
template<class T,enable_if_t<is_signed<T>::value,int> =0>
static_modint(T v)noexcept{ll x=static_cast<ll>(v%static_cast<ll>(umod()));if(x<0)x+=umod();_v=static_cast<ui>(x);}
template<class T,enable_if_t<is_unsigned<T>::value,int> =0>
static_modint(T v)noexcept{_v=static_cast<ui>(v%umod());}
static_modint(bool v)noexcept{_v=static_cast<ui>(v%umod());}
ui val()const noexcept{return _v;}
mint&operator++()noexcept{++_v;if(_v==umod())_v=0;return *this;}
mint&operator--()noexcept{if(_v==0)_v=umod();--_v;return *this;}
mint operator++(int)noexcept{mint tmp=*this;++*this;return tmp;}
mint operator--(int)noexcept{mint tmp=*this;--*this;return tmp;}
mint&operator+=(const mint&rhs)noexcept{_v+=rhs._v;if(_v>=umod())_v-=umod();return *this;}
mint&operator-=(const mint&rhs)noexcept{if(_v<rhs._v)_v+=umod();_v-=rhs._v;return *this;}
mint&operator*=(const mint&rhs)noexcept{ull z=_v;z*=rhs._v;_v=static_cast<ui>(z%umod());return *this;}
mint&operator/=(const mint&rhs){return *this=*this*rhs.inv();}
mint operator+()const noexcept{return *this;}
mint operator-()const noexcept{return mint()-*this;}
mint pow(ll n)const{mint x=*this,r=1;while(n){if(n&1)r*=x;x*=x;n>>=1;}return r;}
mint inv()const{if constexpr(prime)return pow(umod()-2);else{auto eg=math::invgcd(_v,m);return raw(static_cast<int>(eg.second));}}
friend mint operator+(const mint& lhs,const mint& rhs)noexcept{return mint(lhs)+=rhs;}
friend mint operator-(const mint& lhs,const mint& rhs)noexcept{return mint(lhs)-= rhs;}
friend mint operator*(const mint& lhs,const mint& rhs)noexcept{return mint(lhs)*=rhs;}
friend mint operator/(const mint& lhs,const mint& rhs){return mint(lhs)/=rhs;}
friend bool operator==(const mint& lhs,const mint& rhs)noexcept{return lhs._v==rhs._v;}
friend bool operator!=(const mint& lhs,const mint& rhs)noexcept{return lhs._v!=rhs._v;}
private:
ui _v;
};
template<int id>struct dynamic_modint{
using mint=dynamic_modint;
static int mod()noexcept{return static_cast<int>(bt.umod());}
static void set_mod(int m){bt=barrett(m);}
static mint raw(int v)noexcept{mint x;x._v=static_cast<ui>(v);return x;}
dynamic_modint()noexcept:_v(0){}
template<class T,enable_if_t<is_integral<T>::value,int> =0>
dynamic_modint(T v)noexcept{if constexpr(is_signed<T>::value){ll x=static_cast<ll>(v%static_cast<ll>(mod()));if(x<0)x+=mod();_v=static_cast<ui>(x);}else _v=static_cast<ui>(v%mod());}
ui val()const noexcept{return _v;}
mint&operator++()noexcept{if(++_v==umod())_v=0;return *this;}
mint&operator--()noexcept{if(_v==0)_v=umod();--_v;return *this;}
mint operator++(int)noexcept{mint t=*this;++*this;return t;}
mint operator--(int)noexcept{mint t=*this;--*this;return t;}
mint&operator+=(const mint& rhs)noexcept{_v+=rhs._v;if(_v>=umod())_v-=umod();return *this;}
mint&operator-=(const mint& rhs) noexcept {if(_v<rhs._v)_v+=umod();_v-=rhs._v;return *this;}
mint&operator*=(const mint& rhs)noexcept{_v=bt.mul(_v,rhs._v);return *this;}
mint&operator/=(const mint& rhs){return *this=*this*rhs.inv();}
mint operator+()const noexcept{return *this;}
mint operator-()const noexcept{return mint()-*this;}
mint pow(ll n)const{mint x=*this,r=1;while(n){if(n&1)r*=x;x*=x;n>>=1;}return r;}
mint inv()const{auto eg=math::invgcd(_v,mod());return raw(static_cast<int>(eg.second));}
friend mint operator+(const mint& lhs,const mint& rhs)noexcept{return mint(lhs)+=rhs;}
friend mint operator-(const mint& lhs,const mint& rhs)noexcept{return mint(lhs)-=rhs;}
friend mint operator*(const mint& lhs,const mint& rhs)noexcept{return mint(lhs)*=rhs;}
friend mint operator/(const mint& lhs,const mint& rhs){return mint(lhs)/=rhs;}
friend bool operator==(const mint& lhs,const mint& rhs)noexcept{return lhs._v==rhs._v;}
friend bool operator!=(const mint& lhs,const mint& rhs)noexcept{return lhs._v!=rhs._v;}
private:
ui _v;
static barrett bt;
static ui umod()noexcept{return bt.umod();}
};
template<int id>barrett dynamic_modint<id>::bt=998244353;
template<class S,S(*op)(const S&,const S&),S(*e)()>struct segtree{
segtree():segtree(0){}
explicit segtree(int n):_n(n){log=math::ceilpow2(_n);size=1<<log;d=vector<S>(2*size,e());}
explicit segtree(const vector<S>&v):_n(static_cast<int>(v.size())-1){log=math::ceilpow2(_n);size=1<<log;d.resize(2*size);if(_n>0){copy(v.begin()+1,v.end(),d.begin()+size);fill(d.begin()+size+_n,d.end(),e());for(int i=size-1;i>=1;i--)update(i);}else fill(d.begin(),d.end(),e());}
void set(int p,const S& x){p=p+size-1;d[p]=x;for(int i=1;i<=log;i++)update(p>>i);}
const S& get(int p)const{return d[p+size-1];}
S prod(int l,int r)const{if(l>r)return e();S sml=e(),smr=e();for(int L=l+size-1,R=r+size;L<R;L>>=1,R>>=1){if(L&1)sml=op(sml,d[L++]);if(R&1)smr=op(d[--R],smr);}return op(sml,smr);}
const S& all_prod()const{return d[1];}
template<bool(*f)(const S&)>int max_right(int l)const{return max_right(l,[](const S& x){return f(x);});}
template<class F>int max_right(int l,F f)const{if(l>_n)return _n;int cur=l+size-1;S sm=e();do{cur>>=math::bsf(static_cast<ui>(cur));if(!f(op(sm,d[cur]))){while(cur<size){cur=(2*cur);if(f(op(sm,d[cur]))){sm=op(sm,d[cur]);cur++;}}return cur-size;}sm=op(sm,d[cur]);cur++;}while((cur&(cur-1)));return _n;}
template<bool(*f)(const S&)>int min_left(int r)const{return min_left(r,[](const S& x){return f(x);});}
template<class F>int min_left(int r,F f)const{if(r<1)return 1;int cur=r+size-1;S sm=e();do{while(cur>1&&(cur&1))cur>>=1;if(!f(op(d[cur],sm))){while(cur<size){cur=(2*cur+1);if(f(op(d[cur],sm))){sm=op(d[cur],sm);cur--;}}return cur-size+2;}sm=op(d[cur],sm);cur--;}while((cur&(cur-1)));return 1;}
private:
int _n,size,log;
vector<S> d;
void update(int k){d[k]=op(d[2*k],d[2*k+1]);}
};
template<class S,S(*op)(S,S),S(*e)(),class F,S(*mapping)(F,S),F(*composition)(F,F),F(*id)()>struct lazy_segtree{
lazy_segtree():lazy_segtree(0){}
explicit lazy_segtree(int n):_n(n){log=math::ceilpow2(_n);size=1<<log;d=vector<S>(2*size,e());lz=vector<F>(size,id());}
explicit lazy_segtree(const vector<S>& v):_n(static_cast<int>(v.size())-1){log=math::ceilpow2(_n);size=1<<log;d.resize(2*size);lz=vector<F>(size,id());if(_n>0){copy(v.begin()+1,v.end(),d.begin()+size);fill(d.begin()+size+_n,d.end(),e());for(int i=size-1;i>=1;i--)update(i);}else fill(d.begin(), d.end(), e());}
void set(int p,const S& x){p=p+size-1;for(int i=log;i>=1;i--)push(p>>i);d[p]=x;for(int i=1;i<=log;i++)update(p>>i);}
S get(int p){p=p+size-1;for(int i=log;i>=1;i--)push(p>>i);return d[p];}
S prod(int l,int r){if(l>r)return e();int L=l+size-1,R=r+size;for(int i=log;i>=1;i--){if(((L>>i)<<i)!=L)push(L>>i);if(((R>>i)<<i)!=R)push((R-1)>>i);}S sml=e(),smr=e();for(;L<R;L>>=1,R>>=1){if(L&1)sml=op(sml,d[L++]);if(R&1)smr=op(d[--R],smr);}return op(sml,smr);}
const S& all_prod()const{return d[1];}
void apply(int p,const F& f){p=p+size-1;for(int i=log;i>=1;i--)push(p>>i);d[p]=mapping(f,d[p]);for(int i=1;i<=log;i++)update(p>>i);}
void apply(int l, int r, const F& f){if(l>r)return;int L=l+size-1,R=r+size;for(int i=log;i>=1;i--){if(((L>>i)<<i)!=L)push(L>>i);if(((R>>i)<<i)!=R)push((R-1)>>i);}{int l2=L,r2=R;for(;L<R;L>>= 1,R>>=1){if(L&1)all_apply(L++,f);if(R&1)all_apply(--R,f);}L=l2;R=r2;}for(int i=1;i<=log;i++){if(((L>>i)<<i)!=L)update(L>>i);if(((R>>i)<<i)!=R)update((R-1)>>i);}}
template<bool(*f)(const S&)>int max_right(int l){return max_right(l,[](const S& x){return f(x);});}
template<class G>int max_right(int l,G g){if(l>_n)return _n;int cur=l+size-1;for(int i=log;i>=1;i--)push(cur>>i);S sm=e();do{while((cur&1)==0)cur>>=1;if(!g(op(sm,d[cur]))){while(cur<size){push(cur);cur=(2*cur);if(g(op(sm,d[cur]))){sm=op(sm,d[cur]);cur++;}}return cur-size;}sm=op(sm,d[cur]);cur++;}while(cur&(cur-1));return _n;}
template<bool(*f)(const S&)>int min_left(int r){return min_left(r,[](const S& x){return f(x);});}
template<class G> int min_left(int r, G g) {if(r<1)return 1;int cur=r+size-1;for(int i=log;i>=1;i--)push(cur>>i);S sm=e();do{while(cur>1&&(cur&1))cur>>=1;if(!g(op(d[cur],sm))){while(cur<size){push(cur);cur=(2*cur+1);if(g(op(d[cur],sm))){sm=op(d[cur],sm);cur--;}}return cur-size+2;}sm=op(d[cur],sm);if((cur&-cur)==cur)break;cur--;}while(1);return 1;}
private:
int _n,size,log;
vector<S> d;
vector<F> lz;
void update(int k){d[k]=op(d[2*k],d[2*k+1]);}
void all_apply(int k,const F& f){d[k]=mapping(f,d[k]);if(k<size)lz[k]=composition(f,lz[k]);}
void push(int k){all_apply(2*k,lz[k]);all_apply(2*k+1,lz[k]);lz[k]=id();}
};
struct BigInt{
using BI=BigInt;
static constexpr int B=1e9,W=9;
int sign;vector<int> d;
void trim(){while(!d.empty()&&!d.back())d.pop_back();if(d.empty())sign=1;}
BigInt(ll v=0){sign=(v<0)?-1:1;ull u=(v<0)?-static_cast<ull>(v):v;while(u){d.push_back(u%B);u/=B;}}
BigInt(int v):BigInt((ll)v){}
BigInt(const string&s){sign=1;if(s.empty())return;int st=(s[0]=='-'||s[0]=='+');if(s[0]=='-')sign=-1;for(int i=s.size();i>st;i-=W){int l=max(st,i-W);d.push_back(stoi(s.substr(l,i-l)));}trim();}
BigInt(const char*s):BI(string(s)){}
bool empty()const{return d.empty();}
static int cmp_abs(const BI&a,const BI&b){if(a.d.size()!=b.d.size())return a.d.size()<b.d.size()?-1:1;for(int i=(int)a.d.size()-1;i>=0;--i)if(a.d[i]!=b.d[i])return a.d[i]<b.d[i]?-1:1;return 0;}
static BI add_abs(const BI&a,const BI&b){BI c;c.d.resize(max(a.d.size(),b.d.size())+1);ull cy=0;for(size_t i=0;i<c.d.size();++i){if(i<a.d.size())cy+=a.d[i];if(i<b.d.size())cy+=b.d[i];c.d[i]=cy%B;cy/=B;}c.trim();return c;}
static BI sub_abs(const BI&a,const BI&b){BI c=a;ll cy=0;for(size_t i=0;i<c.d.size();++i){cy+=c.d[i]-(i<b.d.size()?b.d[i]:0);c.d[i]=(cy<0?cy+B:cy);cy=(cy<0?-1:0);}c.trim();return c;}
BI operator-()const{BI r=*this;if(!r.empty())r.sign=-r.sign;return r;}
bool operator==(const BI&o)const{return sign==o.sign&&d==o.d;}
bool operator!=(const BI&o)const{return!(*this==o);}
bool operator<(const BI&o)const{if(sign!=o.sign)return sign<o.sign;return sign==1?cmp_abs(*this,o)<0:cmp_abs(*this,o)>0;}
bool operator<=(const BI&o)const{return!(o<*this);}
bool operator>(const BI&o)const{return o<*this;}
bool operator>=(const BI&o)const{return!(*this<o);}
BI operator+(const BI&o)const{if(sign==o.sign){BI c=add_abs(*this,o);c.sign=c.empty()?1:sign;return c;}if(cmp_abs(*this,o)>=0){BI c=sub_abs(*this,o);c.sign=c.empty()?1:sign;return c;}BI c=sub_abs(o,*this);c.sign=c.empty()?1:o.sign;return c;}
BI operator-(const BI&o)const{return*this+(-o);}
BI operator*(const BI&o)const{if(empty()||o.empty())return{};BI c;c.sign=sign*o.sign;c.d.assign(d.size()+o.d.size(),0);for(size_t i=0;i<d.size();++i){ull cy=0;for(size_t j=0;j<o.d.size();++j){unsigned __int128 cur=(unsigned __int128)c.d[i+j]+(ull)d[i]*o.d[j]+cy;c.d[i+j]=cur%B;cy=cur/B;}c.d[i+o.d.size()]+=cy;}c.trim();return c;}
BI shift(int k)const{if(empty()||k<=0)return*this;BI r=*this;r.d.insert(r.d.begin(),k,0);return r;}
static pair<BI,BI> divmod(BI a,BI b){if(b.empty())throw 0;int sa=a.sign,sb=b.sign;a.sign=b.sign=1;if(cmp_abs(a,b)<0){a.sign=sa;a.trim();return{{},a};}BI q;q.d.resize(a.d.size()-b.d.size()+1);for(int i=(int)q.d.size()-1;i>=0;--i){size_t p=b.d.size()+i;unsigned __int128 num=(p<a.d.size()?a.d[p]:0);if(p-1<a.d.size())num=num*B+a.d[p-1];if(b.d.size()>=2&&p>=2&&p-2<a.d.size())num=num*B+a.d[p-2];unsigned __int128 den=b.d.back();if(b.d.size()>=2)den=den*B+b.d[b.d.size()-2];int l=0,r=B-1,ans=0;if(den){l=max((unsigned __int128)0,num/(den+1));r=min((unsigned __int128)(B-1),num/den+1);}while(l<=r){int m=l+(r-l)/2;if(cmp_abs((b*m).shift(i),a)<=0){ans=m;l=m+1;}else r=m-1;}q.d[i]=ans;if(ans)a=sub_abs(a,(b*ans).shift(i));}q.sign=sa*sb;q.trim();a.sign=sa;a.trim();return{q,a};}
BI operator/(const BI&o)const{return divmod(*this,o).fs;}
BI operator%(const BI&o)const{return divmod(*this,o).sc;}
BI& operator+=(const BI&o){return*this=*this+o;}
BI& operator-=(const BI&o){return*this=*this-o;}
BI& operator*=(const BI&o){return*this=*this*o;}
BI& operator/=(const BI&o){return*this=*this/o;}
BI& operator%=(const BI&o){return*this=*this%o;}
string to_string()const{if(empty())return"0";string s=(sign<0?"-":"");char b[16];snprintf(b,16,"%d",d.back());s+=b;for(int i=(int)d.size()-2;i>=0;--i){snprintf(b,16,"%09d",d[i]);s+=b;}return s;}
void print()const{if(empty()){putchar('0');return;}if(sign<0)putchar('-');printf("%d",d.back());for(int i=(int)d.size()-2;i>=0;--i)printf("%09d",d[i]);}
void println()const{print();putchar('\n');}
const char* c_str()const{static string b;b=to_string();return b.c_str();}
bool scan(){static char b[1<<20];if(scanf("%s",b)!=1)return 0;*this=BI(b);return 1;}
friend ostream& operator<<(ostream&os,const BI&v){return os<<v.to_string();}
friend istream& operator>>(istream&is,BI&v){string s;if(is>>s)v=BI(s);return is;}
};
int main(){
BigInt a,b;
a.scan(),b.scan();
(a*b).print();
}
/*
*/
| Compilation | N/A | N/A | Compile OK | Score: N/A | 显示更多 |
| Testcase #1 | 20.726 ms | 100 KB | Accepted | Score: 100 | 显示更多 |