FOJ 1404 Andy的作业

来源:互联网 发布:oracle默认端口多少 编辑:程序博客网 时间:2024/04/30 18:03
Andy的作业

Time Limit:1sMemory limit:32M
Accepted Submit:151Total Submit:1020

Andy每天都有很多作业要做,他的老师总是在说“这些作业你明天必须交上来……”。现在他找你帮忙做其中的一项作业,给出N个整数A1, A2, ..., AN,有 M 个询问 q (L, R),对于每个询问,你要输出一个整数,第L个数到第R个数的乘积,这个乘积不会超过1000位。

输入

输入包含多组测试数据。每组数据第一行为两个整数N,M (N <= 800, M <= 1000) 接下来N行,给出这N个整数。然后M行,每行两个整数L R表示一个询问。

输出

对于每个询问,输出相应的结果。当所有询问结束之后输出“Homework Finished”。

样例输入

10 597964958345 93 88 1010 101 71 111 1

样例输出

432077760964612360Homework Finished1Homework Finished

Original: Andy Zhau's Contest No.1

高精度乘法,据说可以用线段树来说-______________-反正我是土土的算的...

 

  1. #include <stdio.h>
  2. #include <string.h>
  3. int num[800],cop[800];
  4. unsigned long long  a[63]={1};
  5. void pro(int s,int l)
  6. {
  7. int m=0,c,i,j,flag=1;
  8. memset(a,0,sizeof(a));
  9. a[0]=1;
  10. for(i=s;i<=l;i++)
  11. if(num[i-1]==0) {printf("0/n");return;}
  12.  for(i=s;i<=l;i++)
  13.     {if(num[i-1]<0) flag*=-1;
  14.      c=0;
  15.      for(j=0;j<=m;j++)
  16.         {
  17.          a[j]=a[j]*cop[i-1]+c;
  18.          c=a[j]/10000000000000;
  19.          a[j]%=10000000000000;
  20.         }
  21.      if(c>0) {m++;a[m]=c;}
  22.     }
  23.  if(flag==-1) printf("-");
  24.  printf("%llu",a[m]);
  25.  for(i=m-1;i>=0;i--)
  26.      printf("%13.13llu",a[i]);
  27.  printf("/n");
  28. }
  29. int main()
  30. {int m,n,t,_l,_s,i;
  31.  //freopen("D://in.txt","r",stdin);
  32.  while(scanf("%d%d",&n,&m)!=EOF)
  33.     {t=0;
  34.      while(n--)
  35.         scanf("%d",&num[t++]);
  36.      for(i=0;i<t;i++) cop[i]=num[i]>=0?num[i]:-num[i];
  37.      while(m--)
  38.         {
  39.          scanf("%d%d",&_s,&_l);
  40.          pro(_s,_l);
  41.         }
  42.      printf("Homework Finished/n");
  43.     }
  44.  return 0;
  45. }

倒,好象程序挺短的说-___________________-写的时候咋就没发现......................

原创粉丝点击