题意:
给f(x),g(x),h(x),求(f(x)*g(x))%h(x)。
分析:
难点是如何做除数是大数的高精度除法,如果除数不是大数只有被除数是大数的话4,5行代码就可以写除法部分了(http://blog.csdn.net/sepnine/article/details/46562599)。
代码:
//poj 1060
//sep9
#include <iostream>
using namespace std;
const int maxN=1024;
struct H
{int len;int a[2*maxN]; void scan(){scanf("%d",&len);for(int i=0;i<len;++i)scanf("%d",&a[len-1-i]);}void print(){printf("%d ",len);for(int i=0;i<len;++i)printf("%d ",a[len-1-i]);puts("");}H operator *(const H y)const{H t;t.len=len+y.len;for(int i=0;i<t.len;++i)t.a[i]=0;for(int i=0;i<len;++i)for(int j=0;j<y.len;++j)t.a[i+j]+=a[i]*y.a[j];for(int i=0;i<t.len;++i)t.a[i]%=2;while(t.len>0&&!t.a[t.len-1])--t.len;return t;}H operator +(const H y)const{H t;t.len=max(len,y.len);int i=0;while(i<len&&i<y.len){t.a[i]=a[i]^y.a[i];++i;}while(i<len){t.a[i]=a[i];++i;}while(i<y.len){t.a[i]=y.a[i];++i;}while(t.len>0&&!t.a[t.len-1])--t.len;return t; }H operator %(const H y)const{H mod,q,two;two.len=2,two.a[0]=0,two.a[1]=1;q.len=len;mod.len=0;for(int i=len-1;i>=0;--i){mod=mod*two;mod.a[0]=a[i];if(mod.len==0)++mod.len; if(mod.len<y.len)q.a[i]=0;else{q.a[i]=1;for(int j=0;j<mod.len;++j)mod.a[j]=mod.a[j]^y.a[j];while(mod.len>0&&!mod.a[mod.len-1])--mod.len;} } return mod;}
};
H f,g,h,tmp;int main()
{int cases;scanf("%d",&cases);while(cases--){f.scan();g.scan();h.scan();((f*g)%h).print();}return 0;
}