L2-018. 多项式A除以B
时间限制
400 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
陈越
这仍然是一道关于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
题解:这个题目,我在考场上又没做出来。。。这么一想,不知道自己在考场上干嘛?划水划了几个小时?
回来做这个题目又涨知识了。。。原来多项式是这么回事啊!
这个题目有个小细节啊。。double类型的数据,不要直接写成 != 0 (!!!) 精度问题!!!, 写成 >1e-8
1 #include<bits/stdc++.h> 2 using namespace std; 3 //#define loc 4 const int maxn=1e6+5; 5 double a[maxn], b[maxn], ans[maxn]; 6 7 int main(){ 8 #ifdef loc 9 freopen("data.in", "r", stdin); 10 #endif 11 memset(a, 0, sizeof(a)); 12 memset(b, 0, sizeof(b)); 13 memset(ans, 0, sizeof(ans)); 14 int n, m; 15 cin>>n; 16 int max_a=-1, max_b=-1, c, d, m_a, m_b; 17 for(int i=0; i<n; i++){ 18 cin>>c>>d; 19 a[c]=d; 20 max_a=max(max_a, c); 21 } 22 m_a=max_a; 23 cin>>m; 24 for(int i=0; i<m; i++){ 25 cin>>c>>d; 26 b[c]=d; 27 max_b=max(max_b, c); 28 } 29 m_b=max_b; 30 //cout<<max_a <<" "<<max_b<<endl; 31 /* 32 for(int i=n; i>=0; i--) cout<<i<<" "<<a[i]<<" "; 33 cout<<endl; 34 for(int i=m; i>=0; i--) cout<<i<<" "<<b[i]<<" "; 35 cout<<endl; 36 */ 37 int cnt_1=0, cnt_2=0; 38 while(max_a>=max_b){ 39 double x=a[max_a]/b[max_b]; 40 ans[max_a-max_b]=x; 41 if(fabs(x)>=0.05) cnt_1++; //浮点数的绝对值函数用fabs();整型用abs(); 42 for(int j=0; j<=max_b; j++){ 43 a[j+max_a-max_b]-=b[j]*x; 44 } 45 int j; 46 for(j=max_a; j>=0; j--){ 47 if(fabs(a[j])>=0.05){ 48 max_a=j; 49 break; 50 } 51 } 52 if(j<0) break; 53 } 54 if(cnt_1==0){ 55 cout<<"0 0 0.0"; 56 } 57 else{ 58 cout<<cnt_1; 59 for(int i=m_a; i>=0; i--){ 60 if(fabs(ans[i])>=0.05){ 61 printf(" %d %.1f", i, ans[i]); 62 } 63 } 64 } 65 cout<<endl; 66 for(int i=m_a; i>=0; i--){ 67 if(fabs(a[i])>=0.05) cnt_2++; 68 } 69 if(cnt_2==0){ 70 cout<<"0 0 0.0"; 71 } 72 else{ 73 cout<<cnt_2; 74 for(int i=m_a; i>=0; i--){ 75 if(fabs(a[i])>=0.05){ 76 printf(" %d %.1f", i, a[i]); 77 } 78 } 79 } 80 cout<<endl; 81 return 0; 82 }