[Codeforces1009E]Intercity Travelling 数学题

编程入门 行业动态 更新时间:2024-10-18 06:07:39

[Codeforces1009E]Intercity Travelling <a href=https://www.elefans.com/category/jswz/34/1748175.html style=数学题"/>

[Codeforces1009E]Intercity Travelling 数学题

题目传送:

题目大意

      给你一个长度为n的序列a,a[i]代表连续走第 i km时,第 i km的花费。现有一段长度为n km的路,输出从头走到尾的花费的期望*2n-1(一定是个整数)对998244353取模后的结果。

输入格式

      第一行一个整数 n ,意义如题目大意所述。

      第二行 n 个整数,代表 a1, a2, …, an

输出格式

      一个整数,为花费的期望*2n-1,答案对998244353取模。

数据范围

      1 <= n <= 106,1 <= ai <= 106


解法

      首先答案的期望为,乘上2n-1其实就是每种情况的花费之和。

      我们考虑每一位对答案的贡献。

      考虑第 i 位为连续的第 j 段,那么它的贡献就是。第 i 位只能是当前连续的第1~i,但当它为第 i 段时,只有2n-i种情况,所以第 i 位贡献为:

      枚举每一位,总共的贡献就是:

      貌似时间会炸,但如果我们把它变个型:

      从上面那张图到这张图的第一行这一步变化可以用加的次数分析。

      然后我们只需枚举一层1~n-1就可以求出答案了,当然,中途一定要记得随时取模,否则爆long long(前两次提交的悲惨经历)。

      提交记录和代码:

  1 #include <cstdio>
  2 #include <cstring>
  3 #include <iostream>
  4 #define P 998244353
  5 using namespace std;
  6 
  7 typedef long long LL;
  8 LL n, a[1000005], ans, p = 1;
  9 
 10 int main()
 11 {
 12 	scanf("%I64d", &n);
 13 	for(int i = 1; i <= n; i++)
 14 		scanf("%I64d", a + i);
 15 	for(int i = n - 1; i > 0; p = (p << 1) % P, i--)
 16 		ans = (ans + (n + 2 - i) * p % P * a[i] % P) % P;//随时mod P以免爆炸 
 17 	printf("%I64d\n", (ans + a[n]) % P);
 18 
 19 	return 0;
 20 }//Rhein_E
View Code

转载于:.html

更多推荐

[Codeforces1009E]Intercity Travelling 数学题

本文发布于:2024-02-11 19:32:26,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1682949.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:数学题   Codeforces1009E   Intercity   Travelling

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!