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\n",sum);
return 0;
}
参考文章:
思路是自己的,代码参考了下,因为超时聊(qwq)
luyehao1,Intercity Travelling(数学公式推导 cf div2 E),https://blog.csdn.net/luyehao1/article/details/81080860
Codeforces D. Intercity Travelling(区间组合)的更多相关文章
- Codeforces 1009E Intercity Travelling | 概率与期望
题目链接 题目大意: 一个人要从$A$地前往$B$地,两地相距$N$千米,$A$地在第$0$千米处,$B$地在第$N$千米处. 从$A$地开始,每隔$1$千米都有$\dfrac{1}{2}$的概率拥有 ...
- CodeForces - 1009E Intercity Travelling
题面在这里! 可以发现全是求和,直接拆开算贡献就好了 #include<bits/stdc++.h> #define ll long long using namespace std; c ...
- Codeforces 1009 E. Intercity Travelling(计数)
1009 E. Intercity Travelling 题意:一段路n个点,走i千米有对应的a[i]疲劳值.但是可以选择在除终点外的其余n-1个点休息,则下一个点开始,疲劳值从a[1]开始累加.休息 ...
- E. Intercity Travelling
E. Intercity Travelling time limit per test 1.5 seconds memory limit per test 256 megabytes input st ...
- Intercity Travelling CodeForces - 1009E (组合计数)
大意: 有一段$n$千米的路, 每一次走$1$千米, 每走完一次可以休息一次, 每连续走$x$次, 消耗$a[1]+...+a[x]$的能量. 休息随机, 求消耗能量的期望$\times 2^{n-1 ...
- Educational Codeforces Round 47 (Rated for Div. 2) :E. Intercity Travelling
题目链接:http://codeforces.com/contest/1009/problem/E 解题心得: 一个比较简单的组合数学,还需要找一些规律,自己把方向想得差不多了但是硬是找不到规律,还是 ...
- Educational Codeforces Round 47 (Rated for Div. 2)E.Intercity Travelling
题目链接 大意:一段旅途长度N,中间可能存在N-1个休息站,连续走k长度时,疲劳值为a1+a2+...+aka_1+a_2+...+a_ka1+a2+...+ak,休息后a1a_1a1开始计, ...
- CodeForces 149D Coloring Brackets 区间DP
http://codeforces.com/problemset/problem/149/D 题意: 给一个给定括号序列,给该括号上色,上色有三个要求 1.只有三种上色方案,不上色,上红色,上蓝色 2 ...
- Codeforces - 149D 不错的区间DP
题意:有一个字符串 s. 这个字符串是一个完全匹配的括号序列.在这个完全匹配的括号序列里,每个括号都有一个和它匹配的括号 你现在可以给这个匹配的括号序列中的括号染色,且有三个要求: 每个括号只有三种情 ...
随机推荐
- Windows版的OpenJDK下载(Red Hat 提供)
OpenJDK 在linux下安装很简单(yum安装),但是OpenJDK的官网没有为我们提供Windows版的安装软件.庆幸的是,Red Hat(红帽)为我们提供了windows版的安装软件. 下载 ...
- [转帖]sql server版本特性简介、版本介绍简介
sql server版本特性简介.版本介绍简介 https://www.cnblogs.com/gered/p/10986240.html 目录 1.1.sql server的版本信息 1.2.版本重 ...
- 【转帖】Infor转型十年启示录:ERP套件厂商为什么要做云平台?
Infor转型十年启示录:ERP套件厂商为什么要做云平台? https://www.tmtpost.com/4199274.html 好像浪潮国际 就是用的infor的ERP软件. 秦聪慧• 2019 ...
- 深层目录文件复制,C# 递归,录音录像图片文件过多,用于测试程序
/// <summary> /// 录音录像图片文件过多只复制目录的前几个文件,用于测试程序 /// d:\file/images/2019-10/01/01/xxxxx.jpg(前几个文 ...
- 深度学习-强化学习(RL)概述笔记
强化学习(Reinforcement Learning)简介 强化学习是机器学习中的一个领域,强调如何基于环境而行动,以取得最大化的预期利益.其灵感来源于心理学中的行为主义理论,即有机体如何在环境给予 ...
- Shell编程学习(七)
if 条件语句的知识与实践 if 条件语句 if条件语句的语法 单分支结构 第一种 if <条件测试表达式> then 指令 fi 第二种 if <条件测试表达式>; then ...
- Jmeter相关参数
一.线程组 线程组主要包含三个参数:线程数.准备时长(Ramp-Up Period(in seconds)).循环次数. 线程数:虚拟用户数.一个虚拟用户占用一个进程或线程.设置多少虚拟用户数在这里也 ...
- 1014 福尔摩斯的约会(C#)
一.题目内容: 大侦探福尔摩斯接到一张奇怪的字条:我们约会吧! 3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfdk d&Hyscvnm.大侦探很快就 ...
- MVC学习笔记(四)---使用linq多表联查(SQL)
1.数据库原型(Students表中的ID和Scores表中的StudentID是对应的) 2.实现效果:查询出每个学生各个科目的成绩(用的是MVC学习笔记(三)—用EF向数据库中添加数据的架构) C ...
- 2019 多益网络java面试笔试题 (含面试题解析)
本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.多益网络等公司offer,岗位是Java后端开发,因为发展原因最终选择去了多益网络,入职一年时间了,也成为了面 ...