zoukankan      html  css  js  c++  java
  • Codeforces D. Intercity Travelling(区间组合)

    题目描述:

    D. Intercity Travelling

    time limit per test

    1.5 seconds

    memory limit per test

    256 megabytes

    input

    standard input

    output

    standard output

    Leha is planning his journey from Moscow to Saratov. He hates trains, so he has decided to get from one city to another by car.

    The path from Moscow to Saratov can be represented as a straight line (well, it's not that straight in reality, but in this problem we will consider it to be straight), and the distance between Moscow and Saratov is n

    km. Let's say that Moscow is situated at the point with coordinate km, and Saratov — at coordinate n

    Driving for a long time may be really difficult. Formally, if Leha has already covered i

    kilometers since he stopped to have a rest, he considers the difficulty of covering-th kilometer as a**i+1

    . The difficulty of the journey is denoted as the sum of difficulties of each kilometer in the journey.

    Fortunately, there may be some rest sites between Moscow and Saratov. Every integer point from 1

    to may contain a rest site. When Leha enters a rest site, he may have a rest, and the next kilometer will have difficulty a1

    , and so on.

    For example, if n=5

    and there is a rest site in coordinate , the difficulty of journey will be 2a1+2a2+a3, the second one — a2, the fourth — a2. Another example: if n=7 and 5

    .

    Leha doesn't know which integer points contain rest sites. So he has to consider every possible situation. Obviously, there are 2n−1

    different distributions of rest sites (two distributions are different if there exists some point such that it contains a rest site in exactly one of these distributions). Leha considers all these distributions to be equiprobable. He wants to calculate p

    Obviously, p⋅2n−1

    is an integer number. You have to calculate it modulo

    .

    Input

    The first line contains one number n

    (

    ) — the distance from Moscow to Saratov.

    The second line contains n

    integer numbers , a2 (1≤a1≤a2≤⋯≤a**n≤106 is the difficulty of i

    Output

    Print one number — p⋅2n−1

    , taken modulo

    .

    Examples

    Input

    Copy

    21 2
    

    Output

    Copy

    5
    

    Input

    Copy

    41 3 3 7
    

    Output

    Copy

    60
    

    思路:

    做到吐血(菜是本质。题目是说求(P*2^{n-1}) ,又因为总共的可能情况就是(2^{n-1}),这样实际上就是求在所有的建立休息站的情况下a1有几种+a2有几种+...+an有几种,即困难度的和。

    经过思考我们可以发现这样一个事实:a1是最容易出现的而an是最不容易出现的,实际上,an出现的可能就一个:无休息站。要出现a1,则需要休息站后面得有1个单位长度,要出现a2,则要休息站后面有2个单位长度,以此类推。这样我们可以来举一个n==4的例子:

    a1: 0----1----2----3----4

    a1: |----|,这个区间段表示一个单位长度。区间段的前面断点处必须有一个休息站才能出现a1,而后面建不建站都可以,后面可以建站的点有1,2,3,2^3种可能

    -----------|----|,区间段移动到这里,同样,前端的必须建一个站保证出现a1,后面有2,3共2^2种可能

    ----------------|----|,到这里是有些区别,前段建站情况下后面有3可建站,前面出现1可建站,共2^2种可能

    ---------------------|----|,这里前方有1,2可建站,共2^2种可能

    对于要出现a1,有2^3+3* 2^2=2 ^(4-1)+(4-1)* 2^(4-1-1)种可能的情况

    a2:0----1----2----3----4

    a2:|----------|,区间在这里时,前端保证建站,才可能出现a2,后端有2,3共2^2种可能

    a2:------|----------|,这里前端建站,后面3可建站,可不建共2^1种可能

    a2: -----------|-----------|,这里时1,可建站,共2^1种可能

    对于要出现a2,有(2^2+2* 2^1= 2^{4-2}+(4-2)* 2^{4-2-1})种可能的情况

    类似的,有

    ai,有(2^{n-i}+(n-i)* 2^{n-i-1})种可能

    最后答案要求(sum_{i=1}^{n}a[i]*s[i])的值。s[i]就是对应a[i]可能的情况数

    注意可能会爆longlong(一定),时刻小心取余,我就在最后写了个sum+=...这忘记取余了,就惨兮兮

    还有读入数据挺大的?好像,加个快速读入吧,如果不了解?看一下上篇博客(嘻嘻)

    这题其实可以及时算,不用快速幂每次算2的幂,直接O(n)预处理进数组,后面O(1)用就行

    代码:

    #include <iostream>
    #include <cstdio>
    #define max_n 1000005
    #define mod 998244353
    using namespace std;
    int n;
    long long a[max_n];
    long long s[max_n];
    long long mi[max_n] = {1,2,4,8,16,32};
    void generator(int n)
    {
        for(int i = 6;i<=n;i++)
        {
            mi[i] = (mi[i-1]*2)%mod;
        }
    }
    inline int read()//整数输入模板
    {
        int X=0,w=0; char ch=0;
        while(!isdigit(ch)) {w|=ch=='-';ch=getchar();}
        while(isdigit(ch)) X=(X<<3)+(X<<1)+(ch^48),ch=getchar();
        return w?-X:X;
    }
    #pragma optimize(2)
    int main()
    {
        n = read();
        for(int i = 1;i<=n;i++)
        {
            a[i] = read();
        }
        //s[1] = 1;
        //s[2] = 3;
        //s[3] = 8;
        //s[4] = 20;
        generator(n);
        long long sum = 0;
        for(int i = 1;i<=n;i++)
        {
            s[i] = (mi[n-i]+(mi[n-i-1]*(n-i)))%mod;
            sum = (sum%mod+(s[i]%mod*a[i]%mod)%mod)%mod;
        }
        //cout << "len " << endl;
        /*for(int i = 1;i<=n;i++)
        {
            cout << s[i] << " ";
        }
        cout << endl;*/
        printf("%I64d
    ",sum);
        return 0;
    }
    
    

    参考文章:

    思路是自己的,代码参考了下,因为超时聊(qwq)

    luyehao1,Intercity Travelling(数学公式推导 cf div2 E),https://blog.csdn.net/luyehao1/article/details/81080860

  • 相关阅读:
    [ZJOI2010]count 数字计数
    小雄数
    简单筛法函数
    [Noip模拟题]lucky
    欧拉线筛
    Intern Day78
    CodeForces1360C
    CodeForces1373B
    Intern Day78
    Intern Day78
  • 原文地址:https://www.cnblogs.com/zhanhonhao/p/11285549.html
Copyright © 2011-2022 走看看