记录编号 16070 评测结果 AAAAAA
题目名称 多项式运算 最终得分 100
用户昵称 Gravatar.Xmz 是否通过 通过
代码语言 C++ 运行时间 0.003 s
提交时间 2010-04-19 15:10:35 内存使用 0.27 MiB
显示代码纯文本
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>

using namespace std;

long long pow(int i,int j)
{
	int re=1;
	if (j & 1) re*=i;
	j=j>>1;
	while (j!=0)
	{
		i*=i;
		if (j & 1) re*=i;
		j=j>>1;
	}
	return re;
}
struct xiang
{
	int mi,xi;
};

int cmp(const void *a,const void *b)
{
	return -((xiang *)a)->mi+((xiang *)b)->mi;
}

struct shizi
{
	int num;

	xiang a[501];
	
	long long suan(int i)
	{
		long long re=0;
		for (int j=1;j<=num;j++)
		{
			re+=a[j].xi*pow(i,a[j].mi);
		}
		return re;
	}
	
	void add(shizi t)
	{
		for (int i=1;i<=t.num;i++)
		{
			int j=1;
			for (j=1;j<=num;j++)
			{
				if (a[j].mi==t.a[i].mi)
				{
					a[j].xi+=t.a[i].xi;
					break;
				}
			}
			if (j>num)
			{
				num++;
				a[num].xi=t.a[i].xi;
				a[num].mi=t.a[i].mi;
			}
		}
	}
	
	void sub(shizi t)
	{
		for (int i=1;i<=t.num;i++)
		{
			int j=1;
			for (j=1;j<=num;j++)
			{
				if (a[j].mi==t.a[i].mi)
				{
					a[j].xi-=t.a[i].xi;
					break;
				}
			}
			if (j>num)
			{
				num++;
				a[num].xi=-t.a[i].xi;
				a[num].mi=t.a[i].mi;
			}
		}
	}
	
	void mul(shizi t)
	{
		shizi st;st.num=0;
		for (int i=1;i<=t.num;i++)
		{
			for (int ii=1;ii<=num;ii++)
			{
				int j=1;
				for (j=1;j<=st.num;j++)
				{
					if (st.a[j].mi==t.a[i].mi+a[ii].mi)
					{
						st.a[j].xi+=t.a[i].xi*a[ii].xi;
						break;
					}
				}
				if (j>st.num)
				{
					st.num++;
					st.a[st.num].xi=t.a[i].xi*a[ii].xi;
					st.a[st.num].mi=t.a[i].mi+a[ii].mi;
				}
			}
		}
		num=st.num;
		for (int i=1;i<=num;i++)
		{
			a[i].xi=st.a[i].xi;
			a[i].mi=st.a[i].mi;
		}
	}
	
	void print()
	{
		qsort(a+1,num,sizeof(a[0]),cmp);
		bool yy=false;
		for (int i=1;i<=num;i++)
		{
			if (a[i].xi!=0)
			{
				if (a[i].xi>0 && yy) printf("+");
				if ( (a[i].xi!=1 && a[i].xi!=-1) || a[i].mi==0) printf("%d",a[i].xi);
				if (a[i].xi==-1 && !a[i].mi==0) printf("-");
				if (a[i].mi==1) printf("x");
				else if (a[i].mi) printf("x^%d",a[i].mi);
				yy=true;
			}
		}
		if (!yy) printf("0");
		printf("\n");
	}
}s,t;

char c[10000];

int deshu(int &i)
{
	int re=0;
	int cc=1;
	if (c[i]=='+') {cc=1;i++;}
	else if (c[i]=='-') {cc=-1;i++;}
	if (!(c[i]>='0' && c[i]<='9')) return cc;
	while (c[i]>='0' && c[i]<='9')
	{
		re*=10;
		re+=c[i]-'0';
		i++;
	}
	return re*cc;
}

void zhuan(shizi &tt)
{
	int i=0;tt.num=0;
	while (i<=(int)strlen(c)-1)
	{
		tt.num++;
		tt.a[tt.num].xi=deshu(i);
		if (c[i]!='x')
		{
			tt.a[tt.num].mi=0;
		}
		else
		{
			i++;
			if (c[i]!='^') tt.a[tt.num].mi=1;
			else
			{
				i++;
				tt.a[tt.num].mi=deshu(i);
			}
		}
	}
}

int main()
{
	freopen("ploy.in","r",stdin);
	freopen("ploy.out","w",stdout);
	scanf("%s",c);
	int i=0;
	while (c[0]!='l')
	{
		i++;
		printf("%d: ",i);
		if (c[0]=='a')
		{
			scanf("%s",c);
			zhuan(s);
			do
			{
			scanf("%s",c);
			if (c[0]=='-' && c[1]=='1') break;
			zhuan(t);
			s.add(t);
			}while (c[0]!='-' || c[1]!='1');
			s.print();
		}
		
		else if (c[0]=='s')
		{
			scanf("%s",c);
			zhuan(s);
			do
			{
			scanf("%s",c);
			if (c[0]=='-' && c[1]=='1') break;
			zhuan(t);
			s.sub(t);
			}while (c[0]!='-' || c[1]!='1');
				s.print();
		}
		
		else if (c[0]=='m')
		{
			scanf("%s",c);
			zhuan(s);
			do
			{
			scanf("%s",c);
			if (c[0]=='-' && c[1]=='1') break;
			zhuan(t);
			s.mul(t);
			}while (c[0]!='-' || c[1]!='1');
				s.print();
		}
		else if (c[0]=='e')
		{
			int ttt;
			scanf("%d",&ttt);
			scanf("%s",c);
			zhuan(s);
			cout<<s.suan(ttt)<<endl;
		}
		scanf("%s",c);
	}
	return 0;
}