ACdream群(167655270)原创群赛(3) 1028 Problem G Multiplication

1028: Multiplication
Time Limit: 2 Sec  Memory Limit: 128 MB
Submit: 547  Solved: 126
[Submit][Status][Web Board]
Description

If C=A⋄B, then
C[k]=∑max(i,j)=kA[i]⋅B[j]mod(109+7)
.

Work out sequence C=A⋄B for given sequence A and B.
Input

The first line contains a integer n, which denotes the length of sequence A,B.

The second line contains n integers a1,a2,…,an, which denote sequence A.

The thrid line contains n integers b1,b2,…,bn, which denote sequenceB.

(1≤n≤105,0≤ai,bi≤109)
Output

n integers, which denotes sequence C.
Sample Input
2 1 2 3 4
Sample Output
3 18
HINT

Source

ftiasch

http://www.acdream.net/problem.php?id=1028

O(n^2) 算法是肯定超时的
想下就可以发现这样就是可以用O(N)的算法 记录前i个数和就可以了

#include <iostream>
#include <stdio.h>
#include <queue>
#include <stack>
#include <set>
#include <vector>
#include <math.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define N 100002
#define Max 1000000007
#define __int64 long long
__int64 a[N],b[N],aa[N],bb[N];
int main()
{
    int n;
    int i;
    while(scanf("%d",&n)!=EOF)
    {
        for(i=1;i<=n;i++)
         {
             scanf("%lld",&a[i]);
             aa[i]=aa[i-1]+a[i];
         }
        for(i=1;i<=n;i++)
         {
             scanf("%lld",&b[i]);
             bb[i]=bb[i-1]+b[i];
         }
       __int64 ans;
       printf("%lld",a[1]*b[1]%Max);
       for(i=2;i<=n;i++)
       {
           ans=(a[i]*(bb[i-1]%Max)+b[i]*(aa[i-1]%Max)+a[i]*b[i]%Max)%Max;
           printf(" %lld",ans);
       }
    printf("\n");
    }
    return 0;
}

posted on 2012-11-20 17:58  江财小子  阅读(258)  评论(0编辑  收藏  举报