提交记录 7195


用户 题目 状态 得分 用时 内存 语言 代码长度
AH_ 1004. 【模板题】高精度乘法 Time Limit Exceeded 0 3 s 4668 KB C++ 2.97 KB
提交时间 评测时间
2019-01-05 14:45:14 2020-08-01 01:01:09
#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;
}

CompilationN/AN/ACompile OKScore: N/A

Testcase #13 s4 MB + 572 KBTime Limit ExceededScore: 0


Judge Duck Online | 评测鸭在线
Server Time: 2026-04-08 20:47:03 | Loaded in 0 ms | Server Status
个人娱乐项目,仅供学习交流使用 | 捐赠