题目:这仍然是一道关于A/B的题,只不过A和B都换成了多项式。你需要计算两个多项式相除的商Q和余R,其中R的阶数必须小于B的阶数。
输入分两行,每行给出一个非零多项式,先给出A,再给出B。每行的格式如下:
N e[1] c[1] ...... e[N] c[N]
分析:首先要明确知道多项式除法,比如B*D+C = A,在A/B中,D表示商,C表示余数,所以从A的最高项开始比较。
当A的最高项次数大于等于B的最高项次数:很好,直接除。
当A的最高项次数小于B的最高项次数:除不了,除数为0,余数是A。
除法类似整数除法。注意当系数绝对值小于0.05的时候就约等于0(题目要求保留1位小数),否则容易死循换!
#include<iostream> #include<cstring> #include<cmath> #include<algorithm> #include<cstdio> #include<vector> #include<map> #include<set> #include<queue> //#define _for(i,a,b) for(int i=a;i<=b;i++) using namespace std; typedef long long ll; double eps=0.05; ll mod=1e15+7; const int INF =0x3f3f3f; const int MAXN=2e3+10; const int maxn = 1e5+10; //ll inf=100000000000000; //template<typename T>inline void read(T &x) //{ // x=0; // static int p;p=1; // static char c;c=getchar(); // while(!isdigit(c)){if(c=='-')p=-1;c=getchar();} // while(isdigit(c)) {x=(x<<1)+(x<<3)+(c-48);c=getchar();} // x*=p; //} typedef unsigned long long ull; const int N=1e5+7; double e1[N]={0},e2[N]={0},e3[N]={0}; int main() { int n,ma1=0,ma2=0; scanf("%d",&n); for(int i=0;i<n;i++){ int x; double y; scanf("%d%lf",&x,&y); e1[x]+=y; if(x>ma1){ ma1=x; } } int m; scanf("%d",&m); for(int i=0;i<m;i++){ double y; int x;scanf("%d%lf",&x,&y); e2[x]+=y; if(x>ma2)ma2=x; } if(ma2>ma1){ printf("0 0 0.0 "); printf("%d",n); for(int i=ma1;i>=0;i--){ if(fabs(e1[i])>=eps){ printf(" %d %.1lf",i,e1[i]); } } printf(" "); } else { int tp=ma1; while(ma1>=ma2){ double y=e1[ma1]/e2[ma2]; e3[ma1-ma2]+=y; for(int i=ma2;i>=0;i--){ if(fabs(e2[i])>=eps)e1[i+ma1-ma2]-=y*e2[i]; } int tt=0,ii; for(ii=tp;ii>=0;ii--){ if(fabs(e1[ii])>=eps){ if(ii>tt)tt=ii;break; } } if(ii<0)break; ma1=tt; } int f1=0,f2=0; for(int i=tp;i>=0;i--)if(fabs(e3[i])>=eps)f1++; for(int i=tp;i>=0;i--)if(fabs(e1[i])>=eps)f2++; if(f1==0){ printf("0 0 0.0 "); } else { printf("%d",f1); for(int i=tp;i>=0;i--){ if(fabs(e3[i])>=eps){ printf(" %d %.1lf",i,e3[i]); } } printf(" "); } if(f2==0){ printf("0 0 0.0 "); } else { printf("%d",f2); for(int i=tp;i>=0;i--){ if(fabs(e1[i])>=eps){ printf(" %d %.1lf",i,e1[i]); } } } } return 0; }