zoukankan      html  css  js  c++  java
  • 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;
    }

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

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

  • 相关阅读:
    ESP8266 A0的使用
    电脑总是被乱装各种软件怎么办?那就设置一个密码吧!
    笔记本光驱位改装固态系统硬盘教程
    任务管理器无法呼出
    Python stomp 介绍与代码
    Power(x,y)
    旋转图像
    字符串相乘
    缺失的正数
    外观数列
  • 原文地址:https://www.cnblogs.com/tiberius/p/9383189.html
Copyright © 2011-2022 走看看