#include<stdio.h>
#include<stdlib.h>
typedef struct Node{
int coef;
struct Node *next;
}Node;
int cnt = 0;
Node* getNode();
void freeNode(Node* node) {
cnt--;
}
Node* appendTerm(Node *, int, int);
Node* addPoly(Node *, Node *);
Node* ProNode(Node *, Node *);
Node* ProPoly(Node *, Node *);
int main(){
Node *fst, *snd, *rs, *p, *tmp;
fst = getNode();
fst->next = NULL;
snd = getNode();
snd->next = NULL;
int fc,sc,c,e;
p = fst;
for(int i=0; i<fc; i++)
{
p = appendTerm(p,c,e);
}
p = snd;
for(int i=0; i<sc; i++)
{
p = appendTerm(p,c,e);
}
rs = ProPoly(fst,snd);
for(p=rs->next; p!=NULL; p=p->next)
{
}
for(p=fst; p!=NULL;)
{
tmp = p;
p = p->next;
freeNode(tmp);
}
for(p=snd; p!=NULL;)
{
tmp = p;
p = p->next;
freeNode(tmp);
}
for(p=rs; p!=NULL;)
{
tmp = p;
p = p->next;
freeNode(tmp);
}
return 0;
}
Node* getNode(){
cnt++;
Node *New;
New
= (Node
*) malloc(sizeof(Node
)); return New;
}
Node* appendTerm(Node *p, int c, int e){
Node *tmp;
tmp = getNode();
tmp->coef = c;
tmp->next = NULL;
p->next = tmp;
p = p->next;
return p;
}
Node* addPoly(Node *fst, Node *snd){
Node *rs,*k,*i,*j;
int sum;
rs = getNode();
rs->next = NULL;
k = rs;
i = fst->next;
j = snd->next;
while(i!=NULL && j!=NULL)
{
{
k
= appendTerm
(k
,i
->coef
,i
->exp); i = i->next;
}
{
k
= appendTerm
(k
,j
->coef
,j
->exp); j = j->next;
}
else
{
sum = i->coef + j->coef;
if(sum != 0)
k
= appendTerm
(k
,sum
,i
->exp); i = i->next;
j = j->next;
}
}
while(i != NULL)
{
k
= appendTerm
(k
,i
->coef
,i
->exp); i = i->next;
}
while(j != NULL)
{
k
= appendTerm
(k
,j
->coef
,j
->exp); j = j->next;
}
return rs;
}
Node* ProNode(Node *fst, Node* snd){
Node *rs,*k,*i,*j;
rs = getNode();
rs->next = NULL;
k = rs;
i = fst;
j = snd;
while(i != NULL)
{
k
= appendTerm
(k
,i
->coef
*snd
->coef
,i
->exp+snd
->exp); i = i->next;
}
return rs;
}
Node* ProPoly(Node *fst, Node *snd){
Node *rs,*i,*j;
rs = getNode();
rs->next = NULL;
i = fst->next;
j = snd->next;
while(j != NULL)
{
rs = addPoly(rs,ProNode(i,j));
j = j->next;
}
return rs;
}
I2luY2x1ZGU8c3RkaW8uaD4KI2luY2x1ZGU8c3RkbGliLmg+Cgp0eXBlZGVmIHN0cnVjdCBOb2RlewogICAgaW50IGNvZWY7CiAgICBpbnQgZXhwOwogICAgc3RydWN0IE5vZGUgKm5leHQ7Cn1Ob2RlOwppbnQgY250ID0gMDsKCk5vZGUqIGdldE5vZGUoKTsKCnZvaWQgZnJlZU5vZGUoTm9kZSogbm9kZSkgewogICAgZnJlZShub2RlKTsKICAgIGNudC0tOwp9CgpOb2RlKiBhcHBlbmRUZXJtKE5vZGUgKiwgaW50LCBpbnQpOwoKTm9kZSogYWRkUG9seShOb2RlICosIE5vZGUgKik7CgpOb2RlKiBQcm9Ob2RlKE5vZGUgKiwgTm9kZSAqKTsKCk5vZGUqIFByb1BvbHkoTm9kZSAqLCBOb2RlICopOwoKaW50IG1haW4oKXsKICAgIE5vZGUgKmZzdCwgKnNuZCwgKnJzLCAqcCwgKnRtcDsKICAgIGZzdCA9IGdldE5vZGUoKTsKICAgIGZzdC0+bmV4dCA9IE5VTEw7CiAgICBzbmQgPSBnZXROb2RlKCk7CiAgICBzbmQtPm5leHQgPSBOVUxMOwogICAgaW50IGZjLHNjLGMsZTsKICAgIHNjYW5mKCIlZCIsJmZjKTsKICAgIHAgPSBmc3Q7CiAgICBmb3IoaW50IGk9MDsgaTxmYzsgaSsrKQogICAgewogICAgICAgIHNjYW5mKCIlZCAlZCIsJmMsJmUpOwogICAgICAgIHAgPSBhcHBlbmRUZXJtKHAsYyxlKTsKICAgIH0KICAgIHNjYW5mKCIlZCIsJnNjKTsKICAgIHAgPSBzbmQ7CiAgICBmb3IoaW50IGk9MDsgaTxzYzsgaSsrKQogICAgewogICAgICAgIHNjYW5mKCIlZCAlZCIsJmMsJmUpOwogICAgICAgIHAgPSBhcHBlbmRUZXJtKHAsYyxlKTsKICAgIH0KICAgIHJzID0gUHJvUG9seShmc3Qsc25kKTsKICAgIGZvcihwPXJzLT5uZXh0OyBwIT1OVUxMOyBwPXAtPm5leHQpCiAgICB7CiAgICAgICAgcHJpbnRmKCIgJWQgJWQiLCBwLT5jb2VmLCBwLT5leHApOwogICAgfQogICAgcHJpbnRmKCJcbiVkIiwgY250KTsKICAgIGZvcihwPWZzdDsgcCE9TlVMTDspCiAgICB7CiAgICAgICAgdG1wID0gcDsKICAgICAgICBwID0gcC0+bmV4dDsKICAgICAgICBmcmVlTm9kZSh0bXApOwogICAgfQogICAgZm9yKHA9c25kOyBwIT1OVUxMOykKICAgIHsKICAgICAgICB0bXAgPSBwOwogICAgICAgIHAgPSBwLT5uZXh0OwogICAgICAgIGZyZWVOb2RlKHRtcCk7CiAgICB9CiAgICBmb3IocD1yczsgcCE9TlVMTDspCiAgICB7CiAgICAgICAgdG1wID0gcDsKICAgICAgICBwID0gcC0+bmV4dDsKICAgICAgICBmcmVlTm9kZSh0bXApOwogICAgfQogICAgcHJpbnRmKCJcbiVkIiwgY250KTsKCXJldHVybiAwOwp9CgpOb2RlKiBnZXROb2RlKCl7CiAgICBjbnQrKzsKICAgIE5vZGUgKk5ldzsKICAgIE5ldyA9IChOb2RlICopIG1hbGxvYyhzaXplb2YoTm9kZSkpOwogICAgcmV0dXJuIE5ldzsKfQoKTm9kZSogYXBwZW5kVGVybShOb2RlICpwLCBpbnQgYywgaW50IGUpewogICAgTm9kZSAqdG1wOwogICAgdG1wID0gZ2V0Tm9kZSgpOwogICAgdG1wLT5jb2VmID0gYzsKICAgIHRtcC0+ZXhwID0gZTsKICAgIHRtcC0+bmV4dCA9IE5VTEw7CiAgICBwLT5uZXh0ID0gdG1wOwogICAgcCA9IHAtPm5leHQ7CiAgICByZXR1cm4gcDsKfQoKTm9kZSogYWRkUG9seShOb2RlICpmc3QsIE5vZGUgKnNuZCl7CiAgICBOb2RlICpycywqaywqaSwqajsKICAgIGludCBzdW07CiAgICBycyA9IGdldE5vZGUoKTsKICAgIHJzLT5uZXh0ID0gTlVMTDsKICAgIGsgPSByczsKICAgIGkgPSBmc3QtPm5leHQ7CiAgICBqID0gc25kLT5uZXh0OwogICAgd2hpbGUoaSE9TlVMTCAmJiBqIT1OVUxMKQogICAgewogICAgICAgIGlmKGktPmV4cCA+IGotPmV4cCkKICAgICAgICB7CiAgICAgICAgICAgIGsgPSBhcHBlbmRUZXJtKGssaS0+Y29lZixpLT5leHApOwogICAgICAgICAgICBpID0gaS0+bmV4dDsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZihqLT5leHAgPiBpLT5leHApCiAgICAgICAgewogICAgICAgICAgICBrID0gYXBwZW5kVGVybShrLGotPmNvZWYsai0+ZXhwKTsKICAgICAgICAgICAgaiA9IGotPm5leHQ7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIHN1bSA9IGktPmNvZWYgKyBqLT5jb2VmOwogICAgICAgICAgICBpZihzdW0gIT0gMCkKICAgICAgICAgICAgICAgIGsgPSBhcHBlbmRUZXJtKGssc3VtLGktPmV4cCk7CiAgICAgICAgICAgIGkgPSBpLT5uZXh0OwogICAgICAgICAgICBqID0gai0+bmV4dDsKICAgICAgICB9CiAgICB9CiAgICB3aGlsZShpICE9IE5VTEwpCiAgICB7CiAgICAgICAgayA9IGFwcGVuZFRlcm0oayxpLT5jb2VmLGktPmV4cCk7CiAgICAgICAgaSA9IGktPm5leHQ7CiAgICB9CiAgICB3aGlsZShqICE9IE5VTEwpCiAgICB7CiAgICAgICAgayA9IGFwcGVuZFRlcm0oayxqLT5jb2VmLGotPmV4cCk7CiAgICAgICAgaiA9IGotPm5leHQ7CiAgICB9CiAgICByZXR1cm4gcnM7Cn0KCk5vZGUqIFByb05vZGUoTm9kZSAqZnN0LCBOb2RlKiBzbmQpewogICAgTm9kZSAqcnMsKmssKmksKmo7CiAgICBycyA9IGdldE5vZGUoKTsKICAgIHJzLT5uZXh0ID0gTlVMTDsKICAgIGsgPSByczsKICAgIGkgPSBmc3Q7CiAgICBqID0gc25kOwogICAgd2hpbGUoaSAhPSBOVUxMKQogICAgewogICAgICAgIGsgPSBhcHBlbmRUZXJtKGssaS0+Y29lZipzbmQtPmNvZWYsaS0+ZXhwK3NuZC0+ZXhwKTsKICAgICAgICBpID0gaS0+bmV4dDsKICAgIH0KICAgIHJldHVybiByczsKfQoKTm9kZSogUHJvUG9seShOb2RlICpmc3QsIE5vZGUgKnNuZCl7CiAgICBOb2RlICpycywqaSwqajsKICAgIHJzID0gZ2V0Tm9kZSgpOwogICAgcnMtPm5leHQgPSBOVUxMOwogICAgaSA9IGZzdC0+bmV4dDsKICAgIGogPSBzbmQtPm5leHQ7CiAgICB3aGlsZShqICE9IE5VTEwpCiAgICB7CiAgICAgICAgcnMgPSBhZGRQb2x5KHJzLFByb05vZGUoaSxqKSk7CiAgICAgICAgaiA9IGotPm5leHQ7CiAgICB9CiAgICByZXR1cm4gcnM7Cn0K