zoj1026 Modular multiplication of polynomials

  1. //zoj1026 Modular multiplication of polynomials
  2. //Accepted 1026 C ++ 00:00.03 436K
  3. #include <stdio.h>
  4. #include <string.h>
  5. #define MAXN 1000
  6. struct poly{ int deg,x[MAXN<<1];};
  7.  
  8. void print(poly f)
  9. {
  10.        printf ("%d ",f.deg);
  11.        for (int i=f.deg-1; i>0; --i) printf ("%d ",f.x[i]);
  12.        printf ("%d/n",f.x[0]);
  13. }
  14.  
  15. void read(poly &f)
  16. {
  17.        scanf ("%d",&f.deg);
  18.        for (int i=f.deg-1; i>=0; --i) scanf ("%d",&f.x[i]);
  19. }
  20. //r=f*g
  21. void mult(poly f,poly g,poly &r)
  22. {
  23.        memset(r.x,0,sizeof(r.x));
  24.        for (int i=0; i<f.deg; ++i)
  25.               for (int j=0; j<g.deg; ++j)
  26.                      r.x[i+j] = (r.x[i+j]+f.x[i]*g.x[j])%2;
  27.        r.deg = f.deg+g.deg-1;
  28. }
  29. //m=m%h
  30. void mod(poly &m,poly h)
  31. {
  32.        int i;
  33.        while (1){
  34.               for (i=m.deg-1; i>=0&&(!m.x[i]); --i);
  35.               if (i<h.deg-1){
  36.                      m.deg = i+1;
  37.                      break;
  38.               }
  39.               for (int j=h.deg-1; j>=0; --i,--j)
  40.                      m.x[i] = (m.x[i]+h.x[j])%2;
  41.        }
  42. }
  43.  
  44. void solve()
  45. {
  46.        poly f,g,h,m;
  47.        read(f);
  48.        read(g);
  49.        read(h);
  50.        mult(f,g,m);
  51.        mod(m,h);
  52.        print(m);
  53. }
  54.  
  55. int main()
  56. {
  57. #ifdef ONLINE_JUDGE
  58. #else
  59.        freopen("1026.txt","r",stdin);
  60. #endif
  61.        int t;
  62.        while (scanf("%d",&t)!=EOF)
  63.               while (t--)
  64.                      solve();
  65. #ifdef ONLINE_JUDGE
  66. #else
  67.        fclose(stdin);
  68. #endif
  69.        return 0;
  70. }  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值