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 }