[ustctraining][13.05.09]C - 多项式积分
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
2 3 15 2 -2 2 1 0 1 2 3
Sample Output
5x^3+x^2-2x 1/2x^4
code:
#include <iostream> #include <cstdio> #include <cstdlib> #include <string> #include <cmath> using namespace std; #define FOR(i,a,b) for(int i=a;i<=b;i++) #define MST(a,b) memset(a,b,sizeof(a)) #define MAXN 20 int n; int a[MAXN],b[MAXN]; int a1[MAXN],a2[MAXN],b1[MAXN]; int gcd(int a,int b) { return ((a%b==0)?b:gcd(b,a%b)); } int main() { freopen("in.txt","r",stdin); int nn; scanf("%d",&nn); FOR(ii,1,nn) { scanf("%d",&n); FOR(i,1,n)scanf("%d",&a[i]); FOR(i,1,n)scanf("%d",&b[i]); FOR(i,1,n)b1[i]=b[i]+1; FOR(i,1,n)FOR(j,i+1,n) if(b1[i]<b1[j]) { int t=b1[i];b1[i]=b1[j];b1[j]=t; t=a[i];a[i]=a[j];a[j]=t; } int first=1; FOR(i,1,n) { a1[i]=a[i]; a2[i]=b1[i]; if(a1[i]==0)continue; if(a1[i]>0) { if(!first)printf("+"); } if(a1[i]<0) { printf("-"); a1[i]=-a1[i]; } int t=gcd(a1[i],a2[i]); a1[i]=a1[i]/t; a2[i]=a2[i]/t; if(a1[i]!=a2[i]) { printf("%d",a1[i]); if(a2[i]!=1)printf("/%d",a2[i]); } printf("x"); if(b1[i]>1)printf("^%d",b1[i]); first=0; } printf("\n"); } }