NC21479. 左方之地
描述
输入描述
第一行一个数 n。
接下来 n 行,第 i 行一个整数 ai 。
输出描述
输出共一个数,表示答案。
示例1
输入:
3 1 1 1
输出:
665496241
C++14(g++5.4) 解法, 执行用时: 82ms, 内存消耗: 1532K, 提交时间: 2019-09-13 15:12:28
#include <bits/stdc++.h> #define rep(i, a, b) for (int i = a; i <= b; i++) #define per(i, a, b) for (int i = a; i >= b; i--) using namespace std; typedef long long ll; const int maxn = 1e5 + 5; const int mod = 998244353; int n, a[maxn], suf[maxn], inv[maxn], ans; int main() { cin >> n; rep(i, 1, n) cin >> a[i]; inv[1] = 1; rep(i, 2, n + 1) inv[i] = mod - (ll)mod / i * inv[mod % i] % mod; per(i, n, 1) suf[i] = ((ll)a[i] + suf[i + 1]) % mod; rep(i, 1, n) ans = ((ll)ans + a[i] + (ll)inv[i + 1] * 2 * suf[i + 1] % mod) % mod; return !printf("%d\n", ans); }
C++11(clang++ 3.9) 解法, 执行用时: 39ms, 内存消耗: 1256K, 提交时间: 2020-03-18 17:17:56
#include<bits/stdc++.h> #define ll long long using namespace std; const ll p=998244353; ll n,sum,ans,a[500010]; ll ksm(ll x,ll y){ ll xlh=1; while(y){ if(y&1)xlh=xlh*x%p; x=x*x%p; y/=2; } return xlh; } int main(){ ll i; scanf("%lld",&n); for(i=1;i<=n;i++){ scanf("%lld",&a[i]); ans=(ans+(1+sum)*a[i])%p; sum=(sum+2*ksm(i+1,p-2)%p)%p; } printf("%lld",ans); }