记录编号 474784 评测结果 AAAAAA
题目名称 增强的减法问题 最终得分 100
用户昵称 GravatarArrow 是否通过 通过
代码语言 C++ 运行时间 0.045 s
提交时间 2017-11-10 20:55:51 内存使用 0.21 MiB
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <queue>
using namespace std;
#define MAXN 100010
#define INF 0x7fffffff
const int MOD=10000;

struct Great_int
{
	int num[110];
	int len;
	string s;
	bool po_ne;
	Great_int(void)
	{
		memset(num,0,sizeof(num));
		len=0;
		po_ne=1;
		s.clear();
	}
	void transform(void)
	{
		int j=0,i;
		if(s.length()==2)
			num[j]=(s[0]-'0')*10+s[1]-'0',j++;
		else
			if(s.length()==1)
				num[j]=s[0]-'0',j++;
			else
			{
				for(i=s.length()-1;i>=3;i-=4)
					num[j]=(s[i-3]-'0')*1000+(s[i-2]-'0')*100+(s[i-1]-'0')*10+s[i]-'0',j++;
				if(i==2)
					num[j]=(s[0]-'0')*100+(s[1]-'0')*10+(s[2]-'0'),j++;
				else
					if(i==1)
						num[j]=(s[0]-'0')*10+(s[1]-'0'),j++;
					else
						if(i==0)
							num[j]=(s[0]-'0'),j++;
				len=j-1;
			}
	}
	void print(void)
	{
		if(!po_ne)
			printf("-");
		printf("%d",num[len]);
		for(int i=len-1;i>=0;i--)
			printf("%04d",num[i]);
	}
};

Great_int operator + (Great_int x,Great_int y)
{
	Great_int rel;
	int j=max(x.len,y.len);
	for(int i=0;i<=j;i++)
	{
		rel.num[i]+=(x.num[i]+y.num[i]);
		if(rel.num[i]>=MOD)
			rel.num[i+1]+=rel.num[i]/MOD,rel.num[i]%=MOD;
	}
	rel.len= rel.num[j+1]==0 ? j : j+1;
	return rel;
}
Great_int operator - (Great_int x,Great_int y)  // x - y
{
	Great_int rel;
	bool flag=0;
	int j=x.len;
	if(x.len<y.len)
		j=y.len,flag=1;
	if(!flag&&x.len==y.len)
		for(int i=j;i>=0;i--)
			if(y.num[i]>x.num[i])
			{
				flag=1;
				break;
			}
			else
				if(y.num[i]<x.num[i])
					break;
	if(flag)
	{
		int tmp[110];
		memcpy(tmp,x.num,sizeof(x.num));
		memcpy(x.num,y.num,sizeof(y.num));
		memcpy(y.num,tmp,sizeof(tmp));
	}
	for(int i=0;i<=j;i++)
	{
		if(x.num[i]<y.num[i])
			x.num[i+1]-=1,x.num[i]+=MOD;
		rel.num[i]=x.num[i]-y.num[i];
	}
	while(!rel.num[j])
		j--;
	if(j==-1)
		j++;
	rel.len=j;
	if(flag)
		rel.po_ne=0;
	return rel;
}
Great_int operator *(Great_int x,Great_int y)
{
	Great_int rel;
	int k;
	for(int i=0;i<=x.len;i++)
	{
		k=i;
		for(int j=0;j<=y.len;j++,k++)
		{
			rel.num[k]+=x.num[i]*y.num[j];
			if(rel.num[k]>=MOD)
				rel.num[k+1]+=rel.num[k]/MOD,rel.num[k]%=MOD;
		}
	}
	while(!rel.num[k])
		k--;
	rel.len=k;
return rel;
}
/*
void work_1()
{
	int a,b,c;
	scanf("%d%d%d",&a,&b,&c);
	int ans=1;
	while(b)
	{
		if(b&1)
			ans=(ans*a)%c;
		b>>=1;
		a=(a*a)%c;
	}
	printf("%d\n",ans);
}
*/
void work_2()
{
	Great_int x,y;
	cin>>x.s>>y.s;
	x.transform();//x.print();cout<<endl;
	y.transform();//y.print();cout<<endl;
	Great_int ans;
	/*ans=x+y;
	ans.print();
	printf("\n");*/
	ans=x-y;
	ans.print();
	printf("\n");
	/*ans=x*y;
	ans.print();
	printf("\n");*/
}
/*
int gcd(int a,int b)
{
	return b==0 ? a : gcd(b,a%b);
}

void work_3()
{
	int a,b;
	scanf("%d%d",&a,&b);
	int d=gcd(a,b);
	printf("%d\n",d);
}


struct Edge{ int to,nex,w;
bool operator <(const Edge &x)const
{
	return w>x.w;
}
}edges[MAXN];
int head[MAXN],cnt=0,dis[MAXN];

void addedges(int u,int v,int c)
{
	edges[cnt]=(Edge){v,head[u],c},head[u]=cnt++;
	edges[cnt]=(Edge){u,head[v],c},head[v]=cnt++;
}

void work_4()
{
	int n,m,num=0,ans=0;
	//bool in_mst[MAXN];
	scanf("%d%d",&n,&m);
	cnt=0;
	memset(head,-1,sizeof(head));
	for(int i=1;i<=m;i++)
	{
		int u,v,c;
		scanf("%d%d%d",&u,&v,&c);
		addedges(u,v,c);
	}
	priority_queue <Edge> Q;
	for(int i=2;i<=n;i++)
		dis[i]=INF;
	dis[1]=0;
	for(int i=head[1];i!=-1;i=edges[i].nex)
		Q.push(edges[i]),dis[edges[i].to]=edges[i].w;
//	in_mst[1]=1;
	while(num<n-1)
	{
		Edge e=Q.top();Q.pop();
		if(dis[e.to]<e.w)
			continue;
		ans+=e.w;
		dis[e.to]=0;
		num++;
		for(int i=head[e.to];i!=-1;i=edges[i].nex)
		{
			Edge tmp=edges[i];
			if(dis[tmp.to]>tmp.w)
			{
				dis[tmp.to]=tmp.w;
				Q.push(tmp);
			}
		}
	}
	printf("%d\n",ans);
}

void work_5()
{
	int n,m;
	cnt=0;
	scanf("%d%d",&n,&m);
	memset(head,-1,sizeof(head));
	for(int i=1;i<=m;i++)
	{
		int u,v,c;
		scanf("%d%d%d",&u,&v,&c);
		addedges(u,v,c);
	}
	priority_queue <Edge> Q;
	for(int i=2;i<=n;i++)
		dis[i]=INF;
	dis[1]=0;
	Q.push((Edge){1,-1,dis[1]});
	while(!Q.empty())
	{
		Edge e=Q.top();Q.pop();
		if(dis[e.to]<e.w)
			continue;
		for(int i=head[e.to];i!=-1;i=edges[i].nex)
		{
			Edge tmp=edges[i];
			if(dis[tmp.to]>e.w+tmp.w)
			{
				dis[tmp.to]=e.w+tmp.w;
				Q.push((Edge){tmp.to,-1,dis[tmp.to]});
			}
		}
	}
	for(int i=2;i<=n;i++)
		printf("%d ",dis[i]);
}
*/
int main()
{
	freopen("sub.in","r",stdin);
	freopen("sub.out","w",stdout);
	/*int type;
	scanf("%d",&type);
	if(type==1)
		work_1();
	if(type==2)
		work_2();
	if(type==3)
		work_3();
	if(type==4)
		work_4();
	if(type==5)
		work_5();*/
	work_2();
return 0;
}