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
Sample Output
注意輸出細節
#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;
}