
Accept: 149 Submit: 717
Time Limit: 1000 mSec Memory Limit : 32768 KB
Problem Description
给定一个关于x(小写字母)的多项式,求其关于x的一阶积分,结果按降幂输出,要求结果为最简多项式。输出的多项式符合一般书写规则,即有如下特性:
多项式由单项式相加或相减组成,单项式可以表示成ax^b的形式,其中a、b均为整数,b为大于等于0的整数,a不能为0,特别的,当b等于1时,省略”^1”,写做ax,当b等于0时,写作a,而当a的值为±1时,1必须省略。多项式首项的不允许有“+”。
Input
输入第一行为数据组数T。
每组数据第一行是多项式项数n(1<=n<=10),
第二行n个数表示系数,系数均为绝对值小于1000的整数,至少有1个系数不为0。
第三行n个数表示对应系数下x的指数,数据保证指数两两不等,题中给定的指数均为小于1000的非负整数。
Output
输出也只有一行,为积分后的最简多项式,系数如果是分数写成最简分数形式。
Sample Input
2315 2 -22 1 0123
Sample Output
5x^3+x^2-2x1/2x^4
注意输出细节
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
struct node{
int a[2],b;
}num[20];
int gcd(int a,int b){
return b?gcd(b,a%b):a;
}
bool cmp(node x,node y){
return x.b>y.b;
}
int main(){
int T;
cin>>T;
int n;
int i,j;
while(T--){
cin>>n;
for(i=0;i<n;++i){
cin>>num[i].a[0];
}
for(i=0;i<n;++i){
cin>>num[i].b;
num[i].b++;
}
sort(num,num+n,cmp);
int flag=1;
for(i=0;i<n;++i){
num[i].a[1]=num[i].b;
if(num[i].a[0]==0)
continue;
if(num[i].a[0]>0){
if(!flag)
cout<<"+";
}
if(num[i].a[0]<0){
cout<<"-";
num[i].a[0]=-num[i].a[0];
}
int temp=gcd(num[i].a[0],num[i].a[1]);
num[i].a[0]=num[i].a[0]/temp;
num[i].a[1]=num[i].a[1]/temp;
if(num[i].a[0]>1||num[i].a[1]>1)
{
cout<<num[i].a[0];
}
if(num[i].a[1]>1){
cout<<"/"<<num[i].a[1];
}
cout<<"x";
if(num[i].b>1)
cout<<"^"<<num[i].b;
flag=0;
}
cout<<"\n";
}
return 0;
}