#include"cstdio"
#include"cstring"
#include"iostream"
#include"algorithm"
using namespace std;
const int MAXN=1e6+5;
const int MOD=1e9;
const int siz=9;
char ch[2][MAXN];
long long num[6][MAXN];
void slv(int id)
{
int ln=strlen(ch[id]);
for(int i=ln-1;i+1>=siz;i-=siz){
++num[id][0];
for(int j=i-siz+1;j<=i;++j) num[id][num[id][0]]=(num[id][num[id][0]]<<3)+(num[id][num[id][0]]<<1)+(ch[id][j]^'0');
}if(ln%siz){
++num[id][0];
for(int i=0;i<ln%siz;++i) num[id][num[id][0]]=(num[id][num[id][0]]<<3)+(num[id][num[id][0]]<<1)+(ch[id][i]^'0');
}num[id][0]=max(num[id][0],1ll);
return;
}
void clear(int id)
{
for(int i=num[id][0];i;--i) num[id][i]=0;
num[id][0]=1;return;
}
void write(int id)
{
printf("%lld",num[id][num[id][0]]);
for(int i=num[id][0]-1;i;--i) printf("%09lld",num[id][i]);
puts("");return;
}
void init()
{
scanf("%s%s",ch[0],ch[1]);
slv(0);slv(1);return;
}
int cmp(int id1,int id2)
{
if(num[id1][0]>num[id2][0]) return 1;
if(num[id1][0]<num[id2][0]) return -1;
for(int i=num[id1][0];i;--i){
if(num[id1][i]>num[id2][i]) return 1;
if(num[id1][i]<num[id2][i]) return -1;
}return 0;
}
void cpy(int id1,int id2)
{
clear(id1);
for(int i=0;i<=num[id2][0];++i) num[id1][i]=num[id2][i];
return;
}
void ly(int id)
{
for(int i=num[id][0];i;--i){
num[id][i]<<=1;
if(num[id][i]>=MOD) ++num[id][i+1],num[id][i]-=MOD;
}if(num[id][num[id][0]+1]) ++num[id][0];
return;
}
void ry(int id)
{
for(int i=1;i<=num[id][0];++i){
if(num[id][i]&1&&i>1) num[id][i-1]+=MOD>>1;
num[id][i]>>=1;
}if(!num[id][num[id][0]]&&num[id][0]>1) --num[id][0];
return;
}
void pls(int id1,int id2,int id3)
{
num[id3][0]=max(num[id1][0],num[id2][0])+1;
for(int i=1;i<=num[id3][0];++i){
num[id3][i]+=num[id1][i]+num[id2][i];
if(num[id3][i]>=MOD) ++num[id3][i+1],num[id3][i]-=MOD;
}if(!num[id3][num[id3][0]]&&num[id3][0]>1) --num[id3][0];
return;
}
void mnu(int id1,int id2,int id3)
{
num[id3][0]=max(num[id1][0],num[id2][0]);
if(cmp(id1,id2)==-1) putchar('-'),swap(id1,id2);
for(int i=1;i<=num[id3][0];++i){
num[id3][i]+=num[id1][i]-num[id2][i];
if(num[id3][i]<0) --num[id3][i+1],num[id3][i]+=MOD;
}while(!num[id3][num[id3][0]]&&num[id3][0]>1) --num[id3][0];
return;
}
void mul(int id1,int id2,int id3)
{
num[id3][0]=num[id1][0]+num[id2][0];
for(int i=1;i<=num[id1][0];++i){
for(int j=1;j<=num[id2][0];++j){
num[id3][i+j-1]+=num[id1][i]*num[id2][j];
if(num[id3][i+j-1]>=MOD) num[id3][i+j]+=num[id3][i+j-1]/MOD,num[id3][i+j-1]%=MOD;
}
}while(!num[id3][num[id3][0]]&&num[id3][0]>1) --num[id3][0];
return;
}
void div(int id1,int id2,int id3,int id4,int ck,int rk)
{
num[ck][0]=num[ck][1]=1;
while(cmp(id1,id2)>0){ly(id2),ly(ck);}
while(num[ck][0]>1||num[ck][1]){
if(cmp(id1,id2)>=0){
clear(id4);mnu(id1,id2,id4);cpy(id1,id4);
clear(rk);pls(id3,ck,rk);cpy(id3,rk);
}ry(id2),ry(ck);
}return;
}
int main()
{
init();
// pls(0,1,2);write(2);clear(2);
// mnu(0,1,2);write(2);clear(2);
mul(0,1,2);write(2);clear(2);clear(3);
// div(0,1,2,3,4,5);write(2);write(0);
return 0;
}
| Compilation | N/A | N/A | Compile OK | Score: N/A | 显示更多 |
| Testcase #1 | 3 s | 4 MB + 572 KB | Time Limit Exceeded | Score: 0 | 显示更多 |