码迷,mamicode.com
首页 > 其他好文 > 详细

Codeforces 1009E

时间:2018-07-28 20:27:26      阅读:91      评论:0      收藏:0      [点我收藏+]

标签:class   一个   一个个   scan   names   ...   amp   情况   快速   

题意略。

思路:

比如现在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\n",ans);
    return 0;
}

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

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

Codeforces 1009E

标签:class   一个   一个个   scan   names   ...   amp   情况   快速   

原文地址:https://www.cnblogs.com/tiberius/p/9383189.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!