acdream 1028 第三次群赛Problem G: Multiplication

题目这样的:

   给你这个公式个A、B   求C 。  len(A)=len(b)=n

在计算C[k] 时, i 和j 至少有一个等于 k,当 i 和 j 不等时,只要乘另一个的前 k-1 项和就行了。

于是 C[k]=A[k]*SumB[k-1]+B[k]*SumA[k-1]+A[k]*B[k]    mod 10^9+7   注意初始值。

两个int型变量相乘时,可能会溢出,所以在乘之前要先强制转换成 long long ,为此我还WA了几次~

 1 #include <stdio.h>
 2 const int mod=1000000007;
 3 int n;
 4 int a[100001],b[100001];
 5 int  sa[100001],sb[100001];
 6 int c[100001];
 7 void read(int *p,int *s)
 8 {
 9     p[0]=0;s[0]=0;
10     for (int i=1;i<=n;++i)
11    {
12        scanf("%d",p+i);
13        s[i]=(s[i-1]+p[i]%mod)%mod;
14    }
15 }
16 int main()
17 {
18    scanf("%d",&n);
19    read(a,sa);
20    read(b,sb);
21    for (int i=1;i<=n;++i)
22    {
23        long long t1=((long long)a[i]*sb[i-1])%mod;
24        long long t2=((long long)b[i]*sa[i-1])%mod;
25        long long t3=(t1+t2+((long long)a[i]*(long long)b[i])%mod)%mod;
26        c[i]=(int)t3;
27    }
28    for (int i=1;i<n;++i) printf("%d ",c[i]);
29    printf("%d\n",c[n]);
30 }
posted @ 2012-11-18 10:26  wuminye  阅读(250)  评论(0编辑  收藏  举报