#111. czq的时空复杂度

内存限制:1 MiB 时间限制:1000 ms 标准输入输出
题目类型:传统 评测方式:文本比较
上传者: Rhodoks

题目描述

关于时空复杂度,可以参考这篇博客:链接

我们该如何评判一个程序的时间和空间效率?在算法竞赛中,暴力的算法会因为超时或者超内存而无法通过,只有巧妙设计的高效算法才能收获 AC

诚然,我们可以对某些特定的输入进行运行时间和内存的测量。但在准备写程序之前,我们只能用语句的执行次数和使用变量的多少来衡量。不妨设T(n)T(n)为当问题输入规模为nn时,运算的执行次数或使用内存数量。

T(n)T(n)可能是一个很复杂的表达式,幸运的是,我们不需要精确计算,并且只需要估算当nn较大时的大小。此时,常数大小已经不太重要,表达式的值主要由其增长最快的一项决定。例如当T(n)=3n2+2n+4n+10T(n)=3n^2+2n+4\sqrt{n}+10,当nn很大的时候,T(n)T(n)的值是主要由n2n^2项决定的。如果T(n)T(n)是执行次数,我们称此时的时间复杂度为O(n2)O(n^2)

通常情况下复杂度与循环嵌套的最多次数有关,比如二重循环,复杂度就是O(n2)O(n^2)。但不一样的情况也很常见,此时需要具体问题具体分析,例如:

bool isprime(int x)
{
    for (int i=2;i<n;i++)  //复杂度为O(n)
  //for (int i=2;i*i<=n;i++) 复杂度为O(sqrt(n))
        if (x%i==0)
            return false;
    return true;
}

复杂度是估计能否通过的有效方法。在本oj,评测机1s大约能执行10810910^8-10^9次运算(取决于类型),对于n=105n=10^5数据范围的题目,O(n2)O(n^2)的算法显然无法在1s内通过,但O(n),O(nlogn)O(n),O(n\log{n})的算法就可以轻松通过。


本题需要你的算法做到O(n)O(n)的时间复杂度和O(1)O(1)的空间复杂度。

给定长度为nn的数组aia_i,你需要计算i=1nj=1iai×aj\sum_{i=1}^n \sum_{j=1}^i a_i \times a_j,答案对998,244,353998,244,353取模。

注:本题时限和空限是按照C++设定的,所以可能其他语言无法通过(摊手.jpg)

输入格式

第一行一个整数nn,为数组的长度。

接下来一行nn个整数aia_i,由空格隔开。

输出格式

仅一个整数,为答案。

样例

样例输入

6
1 1 4 5 1 4

样例输出

158

数据范围与提示

1n1061 \leq n \leq 10^6

0ai1090 \leq a_i \leq 10^9

提示:

考虑一下,每多一个元素,他对答案的贡献是多少呢?

空间限制不允许你保存下来所有的读入,但是计算答案也并不需要同时保有整个数组。

注意取模。