gplt 團體程式設計天梯賽 多項式A除以B(模擬)
阿新 • • 發佈:2019-02-09
5-10 多項式A除以B (25分)
這仍然是一道關於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
-1/27
,但因其舍入後為0.0,故不輸出。
輸入樣例:
4 4 1 2 -3 1 -1 0 -1
3 2 3 1 -2 0 1
輸出樣例:
3 2 0.3 1 0.2 0 -1.0
1 1 -3.1
解題思路:
這道題賽時沒仔細看,看著大家都跳了,我也跟著跳了,結果最後一小時一分也沒出2333
重現後仔細一看,想起了初中自己yy出來的多項式除法,當時好像是為了因式分解所以想出這個東西的。然後表示很吐血,賽時做一下怎麼也能拿分吧。
具體做法模擬多項式除法去做就好了,如果不知道多項式除法的可以去看百科,或者看我的程式。
然後坑點就在判0了,我一開始被示例 誤導以為0項都在最後面,所以我判0直接從最後開始,然後果斷丟了10分,改下就過了。
程式碼:
#include <bits/stdc++.h> using namespace std; const int maxn=1e5+5; struct node { double a; int mi; }x[maxn], y[maxn], q[maxn], r[maxn], dif[maxn]; int n, m, z; void mod() { int o, p, e=0, i, j, k=0, m1, m2; i=j=0; m1=x[0].mi; m2=y[0].mi; // cout<<m1<<" "<<m2<<endl; while(m1>m2 ||(m1==m2 && fabs(x[0].a-0)>=0.1)) { // printf("m1 %d m2 %d\n", m1, m2); q[k].mi=m1-m2; q[k].a=r[0].a/y[0].a;//得到商 i=0; for(e=1; e<m; e++) //減數多項式 { dif[e].mi=q[k].mi+y[e].mi; //mi相加 dif[e].a=q[k].a*y[e].a; // printf("%.2lf %.2lf %.2lf %d %d %d\n", dif[e].a, q[k].a, y[e].a, dif[e].mi, q[k].mi, y[e].mi); } o=1; p=1; i=0; while(p<n && o<m) { if(r[p].mi>dif[o].mi) //被除數mi大 { x[i]=r[p]; p++; } else if(r[p].mi==dif[o].mi)//mi相等則相減 { x[i].mi=r[p].mi; x[i].a=r[p].a-dif[o].a; p++,o++; } else //除數mi大 { x[i]=dif[o]; x[i].a=-dif[o].a; o++; } i++; } if(p<n) { for(; p<n; p++)x[i++]=r[p]; } else { for(; o<m; o++) { x[i].a=-dif[o].a; x[i].mi=dif[o].mi; i++; } } if(i==0) { x[i].a=0.0; x[i].mi=0; i++; } n=i; for(i=0; i<n; i++) { r[i]=x[i]; // printf("%.1lf %d\n", x[i].a, x[i].mi); } m1=x[0].mi; k++; } z=k; return; } int main() { cin>>n; int i, j=0; for(i=0; i<n; i++) { scanf("%d%lf", &x[j].mi, &x[j].a); /* while(j>0 && x[j-1].mi>x[j].mi+1) { x[j+1]=x[j]; x[j].mi=x[j-1].mi-1; x[j].a=0.0; j++; } */ r[j].a=x[j].a; r[j].mi=x[j].mi; j++; } cin>>m; for(i=0; i<m; i++) { scanf("%d%lf", &y[i].mi, &y[i].a); } mod(); int count=z; for(i=0; i<z; i++)if(fabs(q[i].a)<0.1)count--; cout<<count; for(i=0; i<z; i++)if(!(fabs(q[i].a)<0.1))printf(" %d %.1lf", q[i].mi, q[i].a); if(count==0)printf(" 0 0.0\n"); else printf("\n"); count=n; for(i=0; i<n; i++)if(fabs(r[i].a)<0.1)count--; printf("%d", count); if(count==0)printf(" 0 0.0\n"); for(i=0; i<n; i++)if(!(fabs(r[i].a)<0.1))printf(" %d %.1lf", r[i].mi, r[i].a); } /* 2 1 2 0 1 1 0 2 */