Codeforces 1009E

Posted tiberius

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces 1009E相关的知识,希望对你有一定的参考价值。

题意略。

思路:

比如现在n = 11。那么我们观察a[1.....n]的出现次数:

a[1]:2 ^ 10 + 10 * 2 ^ 9

a[2]:2 ^ 9 + 9 * 2 ^ 8

a[3]:2 ^ 8 + 8 * 2 ^ 7

.........

a[x]:2 ^ (n - x) + (n - x) * 2 ^ (n - x - 1)

凭借这个规律,我们可以通过快速幂求得答案。

详见代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL mod = 998244353;
const LL maxn = 1e6 + 5;

LL an[maxn];

LL qmod(LL a,LL n){
    LL ret = 1;
    while(n){
        if(n & 1) ret = ret * a % mod;
        n = n>>1;
        a = a * a % mod;
    }
    return ret;
}

int main(){
    int n;
    scanf("%d",&n);
    for(int i = 1;i <= n;++i) scanf("%lld",&an[i]);
    LL ans = 0;
    for(int i = 1;i < n;++i){
        LL temp1 = qmod(2,n - i);
        LL temp2 = LL(n - i) * qmod(2,n - i - 1) % mod;
        ans += (temp1 + temp2) % mod * an[i] % mod;
    }
    ans += an[n];
    ans %= mod;
    printf("%lld
",ans);
    return 0;
}

现在反过来想想,为什么可以这么去计算呢?

就是因为它要求的是所有情况的总和,这样我们才可以一个个把它们单独拿出来考虑。

以上是关于Codeforces 1009E的主要内容,如果未能解决你的问题,请参考以下文章

[Codeforces Round #522 (Div. 2, based on Technocup 2019 Elimination Round 3)][C. Playing Piano](代码片段

c_cpp Codeforces片段

Codeforces 86C Genetic engineering(AC自动机+DP)

CodeForces 1005D Polycarp and Div 3(思维贪心dp)

(Incomplete) Codeforces 394 (Div 2 only)

CodeForces 931F Teodor is not a liar!