#111. czq的时空复杂度

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

题目描述

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

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

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

可能是一个很复杂的表达式,幸运的是,我们不需要精确计算,并且只需要估算当较大时的大小。此时,常数大小已经不太重要,表达式的值主要由其增长最快的一项决定。例如当,当很大的时候,的值是主要由项决定的。如果是执行次数,我们称此时的时间复杂度为

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

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大约能执行次运算(取决于类型),对于数据范围的题目,的算法显然无法在1s内通过,但的算法就可以轻松通过。


本题需要你的算法做到的时间复杂度和的空间复杂度。

给定长度为的数组,你需要计算,答案对取模。

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

输入格式

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

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

输出格式

仅一个整数,为答案。

样例

样例输入

6
1 1 4 5 1 4

样例输出

158

数据范围与提示

提示:

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

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

注意取模。