이 시간, 당신은 A와 B 두 개의 다항식됩니다 × B를 찾기로되어있다.
입력 사양 :
각 입력 파일은 하나의 테스트 케이스가 포함되어 있습니다. 각각의 경우 2 개 라인을 차지, 각각의 라인은 다항식의 정보가 포함되어 있습니다 :
K가 N N K N 1 1 N 2 N 2 ... N K
여기서 K는 다항식에서 제로가 아닌 항의 수이고, N 및 N I I (I = 1,2, ⋯, K) 지수 및 계수들은 각각. 이것은 주어진 1≤K≤10 것을 0≤N K <⋯ <N 2 <N 1 ≤1000.
출력 사양 :
만약 입력과 같은 형식으로 출력 한 라인의 A 및 B의 생성물을해야 각 테스트 케이스. 이 있어야한다는주의 사항 NO 각 줄의 끝에 여분의 공간. 1 개 소수점 장소에 정확 최대 주시기 바랍니다.
샘플 입력 :
2 1 2.4 0 3.2
2 2 1.5 1 0.5
샘플 출력 :
3 3 3.6 2 6.0 1 1.6
솔루션의 개요 : 우선 맵 <INT 더블> 다항식의 제 1 세트를 수신 NUM 곱한 후 순차적이어서, 승수를 곱한 차례로 요소를 통해 비를 제 2 곱셈 다항식 NUM 수용되는 정의 제로 항목은 ANS에 저장됩니다. (참고로, 다른 점 다항식 A1002 A + B (25 분) (C ++) )
다음과 같이 코드입니다 :
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
scanf("%d",&n);
map<int,double> num;
map<int,double> ans;
for(int i = 0; i < n; i++){
int exp;
double coe;
scanf("%d %lf",&exp,&coe);
if(coe != 0) num[exp] += coe; // 输入各个项数
// printf("num %d: %d %.1lf\n",i,exp,coe);
}
int m;
scanf("%d",&m);
for(int i = 0; i < m; i++){
int exp;
double coe;
scanf("%d %lf",&exp,&coe);
for(map<int,double>::iterator it = num.begin(); it != num.end(); it++){
int e = it->first;
double c = it->second;
ans[e+exp] += c*coe;
if(ans[e+exp] == 0){
ans.erase(e+exp);
}
}
}
if(ans.size() != 0) printf("%d ",ans.size());
else printf("%d\n",ans.size());
for(map<int,double>::iterator it = ans.end(); it != ans.begin();){
--it;
if(it != ans.begin()) printf("%d %.1lf ",it->first,it->second);
else printf("%d %.1lf\n",it->first,it->second);
}
}