本文主要是介绍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 多项式积分的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!