題目鏈接:https://pintia.cn/problem-sets/1108548596745592832/problems/1108548661014913033
題目大意:
這仍然是一道關於A/B的題,只不過A和B都換成了多項式。你需要計算兩個多項式相除的商Q和余R,其中R的階數必須小於B的階數。
輸入格式:
輸入分兩行,每行給出一個非零多項式,先給出A,再給出B。每行的格式如下:
N e[1] c[1] ... e[N] c[N]
其中N
是該多項式非零項的個數,e[i]
是第i
個非零項的指數,c[i]
是第i
個非零項的系數。各項按照指數遞減的順序給出,保證所有指數是各不相同的非負整數,所有系數是非零整數,所有整數在整型范圍內。
輸出格式:
分兩行先后輸出商和余,輸出格式與輸入格式相同,輸出的系數保留小數點后1位。同行數字間以1個空格分隔,行首尾不得有多余空格。注意:零多項式是一個特殊多項式,對應輸出為0 0 0.0
。但非零多項式不能輸出零系數(包括舍入后為0.0)的項。在樣例中,余多項式其實有常數項-1/27
,但因其舍入后為0.0,故不輸出。
具體思路:模擬多項式除法,注意精度控制。
AC代碼:
1 #include<bits/stdc++.h> 2 using namespace std; 3 # define ll long long 4 # define inf 0x3f3f3f3f 5 const int maxn = 1e5+100; 6 double a[maxn],b[maxn],c[maxn]; 7 int main() 8 { 9 int n,m,tmp,maxa,maxb; 10 scanf("%d",&n); 11 for(int i=0; i<n; i++) 12 { 13 scanf("%d",&tmp); 14 scanf("%lf",&a[tmp]); 15 if(i==0) 16 maxa=tmp; 17 } 18 scanf("%d",&m); 19 for(int i=0; i<m; i++) 20 { 21 scanf("%d",&tmp); 22 scanf("%lf",&b[tmp]); 23 if(i==0) 24 maxb=tmp; 25 } 26 int j; 27 for(int i=maxa; i>=maxb; i--) 28 { 29 c[i-maxb]=a[i]/b[maxb]; 30 for( j=maxb; j>=0; j--) 31 { 32 a[i+j-maxb]-=b[j]*c[i-maxb]; 33 } 34 } 35 int num1=0,num2=0; 36 for(int i=maxa-maxb; i>=0; i--) 37 { 38 if(fabs(c[i])>1e-6) 39 { 40 if(fabs(c[i])<0.05) 41 c[i]=0; 42 else 43 num1++; 44 } 45 } 46 if(num1==0) 47 { 48 printf("0 0 0.0\n"); 49 } 50 else 51 { 52 printf("%d",num1); 53 for(int i=maxa-maxb; i>=0; i--) 54 { 55 if(fabs(c[i])>1e-6) 56 printf(" %d %.1lf",i,c[i]); 57 } 58 printf("\n"); 59 } 60 for(int i=maxb-1; i>=0; i--) 61 { 62 if(fabs(a[i])>1e-6) 63 { 64 // cout<<a[i]<<endl; 65 if(fabs(a[i])<0.05) 66 a[i]=0; 67 else 68 num2++; 69 } 70 } 71 if(num2==0) 72 { 73 printf("0 0 0.0\n"); 74 } 75 else 76 { 77 printf("%d",num2); 78 for(int i=maxb-1; i>=0; i--) 79 { 80 if(fabs(a[i])>1e-6) 81 printf(" %d %.1lf",i,a[i]); 82 } 83 printf("\n"); 84 } 85 }