L2-018 多项式A除以B(模拟)
这仍然是一道关于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,故不输出。
输入样例:
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
题意
如上
题解
A/B=答案ans+余数(就是模拟后A数组)
怎么没给数据范围,反正复杂度n^2,就搞了1000,22分,改成2000,满分了
代码
1 #include<bits/stdc++.h> 2 using namespace std; 3 4 double a[3005],b[3005],ne[3005],ans[3005]; 5 int main() 6 { 7 int n,m,e,c; 8 scanf("%d",&n); 9 for(int i=0;i<n;i++) 10 { 11 scanf("%d%d",&e,&c); 12 a[e]+=c; 13 } 14 int maxm=0; 15 scanf("%d",&m); 16 for(int i=0;i<m;i++) 17 { 18 scanf("%d%d",&e,&c); 19 b[e]+=c; 20 maxm=max(maxm,e); 21 } 22 for(int i=2000;i>=0;i--) 23 { 24 if(a[i]==0)continue; 25 if(i<maxm)break; 26 int zs=i-maxm; 27 double xs=a[i]/b[maxm]; 28 ans[zs]+=xs; 29 for(int j=maxm;j>=0;j--) 30 { 31 ne[j+zs]=b[j]*xs; 32 } 33 for(int j=maxm+zs;j>=0;j--) 34 a[j]-=ne[j]; 35 } 36 int k=0; 37 for(int i=0;i<=2000;i++) 38 { 39 ans[i]=(double)((int)(ans[i]*10+(ans[i]<0?-0.5:0.5)))/10; 40 if(ans[i])k++; 41 } 42 printf("%d",k); 43 if(k==0) 44 { 45 printf(" 0 0.0"); 46 } 47 else 48 { 49 for(int i=2000;i>=0;i--) 50 if(ans[i]) 51 printf(" %d %.1f",i,ans[i]); 52 } 53 printf(" "); 54 int q=0; 55 for(int i=0;i<=2000;i++) 56 { 57 a[i]=(double)((int)(a[i]*10+(a[i]<0?-0.5:0.5)))/10; 58 if(a[i])q++; 59 } 60 printf("%d",q); 61 if(q==0) 62 { 63 printf(" 0 0.0"); 64 } 65 else 66 { 67 for(int i=2000;i>=0;i--) 68 if(a[i]) 69 printf(" %d %.1f",i,a[i]); 70 } 71 return 0; 72 }