FZU - 2115 多项式积分

题意:

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

思路:就是简单的求积分,例如ax^b,假设a1x^(b+1)是它的积分,所以有:a1(b+1)=a

推出a1=gcd(a,b+1)*(a/gcd(a,b+1))/((b+1)/gcd(a,b+1)),因为它要求最简分数形式,注意输出的细节就行了,注意它都是整数,所以对于a/gcd,(b+1)/gcd都是大于等于1的

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef pair<int,int>tp;

tp a[11];
int t,n;

bool cmp(tp a,tp b){
    return a.second > b.second;
}

int gcd(int a,int b){
    return b?gcd(b,a%b):a;
}

int main(){
    scanf("%d",&t);
    while (t--){
        scanf("%d",&n);
        for (int i = 0; i < n; i++)
            scanf("%d",&a[i].first);
        for (int i = 0; i < n; i++)
            scanf("%d",&a[i].second);
        sort(a,a+n,cmp);
        int flag = 0;
        for (int i = 0; i < n; i++){
            int up = a[i].first;
            int low = a[i].second + 1;
            if (up == 0)
                continue;
            if (up > 0 && flag)
                printf("+");
            flag = 1;
            if (up < 0){
                printf("-");
                up = -up;
            }
            int g = gcd(low,up);
            if (up/g > 1 || low > g)
                printf("%d",up/g);
            if (low > g)
                printf("/%d",low/g);
            printf("x");
            if (low > 1)
                printf("^%d",low);
        }
        printf("\n");
    }
    return 0;
}


你可能感兴趣的:(FZU - 2115 多项式积分)