FZOJ2115+月赛+多项式
多项式积分。
注意化简和符号即可。
降幂!!!
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /* 2 多项式积分 3 */ 4 #include<stdio.h> 5 #include<string.h> 6 #include<stdlib.h> 7 #include<algorithm> 8 #include<iostream> 9 #include<queue> 10 #include<vector> 11 #include<map> 12 #include<math.h> 13 typedef long long ll; 14 //typedef __int64 int64; 15 const int maxn = 10; 16 const int maxm = 1005; 17 const int inf = 0x7FFFFFFF; 18 const double pi = acos(-1.0); 19 const double eps = 1e-8; 20 using namespace std; 21 22 struct node{ 23 int x,y,num; 24 double t; 25 }a[ maxn ],b[ maxn ]; 26 27 int gcd( int a,int b ){ 28 int r; 29 while( b!=0 ){ 30 r = a%b; 31 a = b; 32 b= r ; 33 } 34 return a; 35 } 36 37 int cmp( node a,node b ){ 38 return a.t>b.t; 39 } 40 41 int main(){ 42 int ca; 43 scanf("%d",&ca); 44 while( ca-- ){ 45 int n; 46 scanf("%d",&n); 47 for( int i=1;i<=n;i++ ){ 48 scanf("%d",&a[ i ].x); 49 a[ i ].y = 1; 50 a[ i ].num = i; 51 } 52 for( int j=1;j<=n;j++ ){ 53 scanf("%d",&b[ j ].x); 54 b[ j ].y = 1; 55 b[ j ].num = j; 56 } 57 for( int i=1;i<=n;i++ ){ 58 a[ i ].x = a[ i ].x*b[ i ].y; 59 a[ i ].y = a[ i ].y*( b[ i ].x+b[ i ].y ); 60 b[ i ].x = b[ i ].x+b[ i ].y; 61 62 int tgcd = gcd( abs(a[i].x),abs(a[i].y) ); 63 a[ i ].x /= tgcd,a[ i ].y /= tgcd; 64 tgcd = gcd( abs(b[i].x),abs(b[i].y) ); 65 b[ i ].x /= tgcd,b[ i ].y /= tgcd; 66 67 b[ i ].t = 1.0*b[ i ].x/(b[ i ].y*1.0); 68 //printf("%d/%d ",a[i].x,a[i].y); 69 //printf("%d/%d ",b[i].x,b[i].y); 70 } 71 //printf("gcd(12,8)=%d\n",gcd(12,8)); 72 int flag = -1; 73 sort( b+1,b+1+n,cmp ); 74 for( int j=1;j<=n;j++ ){ 75 int i = b[ j ].num;//注意这里的映射关系。降幂输出!! 76 if( a[ i ].x*a[ i ].y!=0 && flag==-1 ){ 77 78 if( a[ i ].x*a[ i ].y>0 ) ; 79 else printf("-"); 80 81 flag++; 82 83 if( a[ i ].x==a[ i ].y||a[ i ].x==-a[ i ].y ) ; 84 else if( abs(a[i].x)%abs(a[i].y)==0 ) printf("%d",abs(a[ i ].x)/abs(a[ i ].y)); 85 else printf("%d/%d",abs(a[i].x),abs(a[i].y));//首项系数 86 87 if( b[ j ].x*b[ j ].y==0 ) continue; 88 if( b[ j ].x==b[ j ].y ) printf("x"); 89 else if( b[ j ].x==-b[ j ].y ) printf("x^-1"); 90 else if( abs(b[ j ].x)%abs(b[ j ].y)==0 ) printf("x^%d",b[ j ].x/b[ j ].y); 91 else { 92 if( b[ j ].x*b[ j ].y<0 ) printf("-"); 93 printf("x^%d/%d",abs(b[ j ].x),abs(b[ j ].y)); 94 }//首项指数 95 } 96 else if( a[ i ].x*a[ i ].y!=0 && flag!=-1 ){ 97 98 if( a[i].x*a[i].y>0 ) printf("+"); 99 else printf("-");//系数符号 100 101 if( a[ i ].x==a[ i ].y||a[ i ].x==-a[ i ].y ) ; 102 else if( abs(a[i].x)%abs(a[i].y)==0 ) printf("%d",abs(a[ i ].x)/abs(a[ i ].y)); 103 else printf("%d/%d",abs(a[i].x),abs(a[i].y));//系数 104 105 if( b[ j ].x*b[ j ].y==0 ) ; 106 if( b[ j ].x==b[ j ].y ) printf("x"); 107 else if( b[ j ].x==-b[ j ].y ) printf("x^-1"); 108 else if( abs(b[ j ].x)%abs(b[ j ].y)==0 ) printf("x^%d",b[ j ].x/b[ j ].y); 109 else { 110 if( b[ j ].x*b[ j ].y<0 ) printf("-"); 111 printf("x^%d/%d",abs(b[ j ].x),abs(b[ j ].y)); 112 }//指数 113 } 114 } 115 printf("\n"); 116 } 117 return 0; 118 }
keep moving...