NC204333. 序列卷积之和
描述
输入描述
第一行一个整数。第二行个整数。
输出描述
输出一行一个整数表示答案。
示例1
输入:
4 6 7 8 9
输出:
1988
示例2
输入:
5 4 7 66 22 8
输出:
59480
C++14(g++5.4) 解法, 执行用时: 81ms, 内存消耗: 3524K, 提交时间: 2020-07-22 14:25:24
#include<bits/stdc++.h> #define ll long long using namespace std; const ll mod=1e9+7; ll n,a[200003],ans=0,s[200003]; int main() { cin>>n; for(int i=1;i<=n;i++)cin>>a[i]; for(int i=1;i<=n;i++)s[i]=s[i-1]+a[i]*(n-i+1); for(int i=1;i<=n;++i) ans=(ans+(((s[n]-s[i-1])%mod)*(a[i]*i%mod))%mod)%mod; cout<<ans; return 0; }
Python3(3.5.2) 解法, 执行用时: 287ms, 内存消耗: 27424K, 提交时间: 2020-05-22 19:35:39
import sys lines = sys.stdin.readlines() n = int(lines[0].strip()) nums = list(map(int, lines[1].strip().split(" "))) pre = [nums[0]] for i in range(1, n): pre.append(nums[i] * (i+1) + pre[-1]) MOD = 10**9 +7 res = 0 for i in range(n): res = (res + pre[i] * nums[i] * (n-i)) % MOD print(res)
C++11(clang++ 3.9) 解法, 执行用时: 47ms, 内存消耗: 1892K, 提交时间: 2020-05-22 20:35:32
#include<bits/stdc++.h> #define ll long long using namespace std; const ll p=1e9+7; ll n,i,xlh,ans,a[500010]; int main(){ scanf("%lld",&n); for(i=1;i<=n;i++){ scanf("%lld",&a[i]); (xlh+=a[i]*i%p)%=p; ans=(ans+xlh*a[i]%p*(n-i+1))%p; } printf("%lld\n",ans); }