首页 > 其他分享 >【AtCoder】Beginner Contest 378-E.Mod Sigma Problem

【AtCoder】Beginner Contest 378-E.Mod Sigma Problem

时间:2024-11-17 16:15:15浏览次数:3  
标签:AtCoder Beginner Contest int sum mathbin leq mathrm mod

题目链接

Problem Statement

You are given a sequence A = ( A 1 , A 2 , … , A N ) A = (A_1, A_2, \dots, A_N) A=(A1​,A2​,…,AN​) of N N N non-negative integers, and a positive integer M M M.

Find the following value:

∑ 1 ≤ l ≤ r ≤ N ( ( ∑ l ≤ i ≤ r A i ) m o d M ) . \sum_{1 \leq l \leq r \leq N} \left( \left(\sum_{l \leq i \leq r} A_i\right) \mathbin{\mathrm{mod}} M \right). 1≤l≤r≤N∑​((l≤i≤r∑​Ai​)modM).

Here, X m o d M X \mathbin{\mathrm{mod}} M XmodM denotes the remainder when the non-negative integer X X X is divided by M M M.

问题陈述

给你一个由 N N N 个非负整数组成的序列 A = ( A 1 , A 2 , … , A N ) A = (A_1, A_2, \dots, A_N) A=(A1​,A2​,…,AN​)和一个正整数 M M M 。

求下列数值:

∑ 1 ≤ l ≤ r ≤ N ( ( ∑ l ≤ i ≤ r A i ) m o d M ) . \sum_{1 \leq l \leq r \leq N} \left( \left(\sum_{l \leq i \leq r} A_i\right) \mathbin{\mathrm{mod}} M \right). 1≤l≤r≤N∑​((l≤i≤r∑​Ai​)modM).
这里, X m o d M X \mathbin{\mathrm{mod}} M XmodM 表示非负整数 X X X 除以 M M M 的余数。

Constraints

  • 1 ≤ N ≤ 2 × 1 0 5 1 \leq N \leq 2 \times 10^5 1≤N≤2×105
  • 1 ≤ M ≤ 2 × 1 0 5 1 \leq M \leq 2 \times 10^5 1≤M≤2×105
  • 0 ≤ A i ≤ 1 0 9 0 \leq A_i \leq 10^9 0≤Ai​≤109

Input

The input is given from Standard Input in the following format:

N M
A1 A2 ... AN

Output

Print the answer.

Sample Input 1

3 4
2 5 0

Sample Output 1

10
  • A 1 m o d M = 2 A_1 \mathbin{\mathrm{mod}} M = 2 A1​modM=2
  • ( A 1 + A 2 ) m o d M = 3 (A_1+A_2) \mathbin{\mathrm{mod}} M = 3 (A1​+A2​)modM=3
  • ( A 1 + A 2 + A 3 ) m o d M = 3 (A_1+A_2+A_3) \mathbin{\mathrm{mod}} M = 3 (A1​+A2​+A3​)modM=3
  • A 2 m o d M = 1 A_2 \mathbin{\mathrm{mod}} M = 1 A2​modM=1
  • ( A 2 + A 3 ) m o d M = 1 (A_2+A_3) \mathbin{\mathrm{mod}} M = 1 (A2​+A3​)modM=1
  • A 3 m o d M = 0 A_3 \mathbin{\mathrm{mod}} M = 0 A3​modM=0

The answer is the sum of these values, 10 10 10. Note that the outer sum is not taken modulo M M M.

Sample Input 2

10 100
320 578 244 604 145 839 156 857 556 400

Sample Output 2

2736

解法

这道题目着重考察[[树状数组]],首先我们先从[[前缀和]]出发。

数组中前 i i i 项和为 s [ i ] s[i] s[i] 。

对题目中计算式子进行变化。
∑ l ≤ i ≤ r A i = s [ r ] − s [ l − 1 ] \sum_{l\leq i \leq r} A_i = s[r] - s[l - 1] l≤i≤r∑​Ai​=s[r]−s[l−1]

接下来,考虑对 M M M 取余操作。

( s [ r ] − s [ l − 1 ] )   m o d   M = { s [ r ] − s [ l − 1 ] , s [ r ] ≥ s [ l − 1 ] s [ r ] − s [ l − 1 ] + M , s [ r ] < s [ l − 1 ] (s[r]-s[l-1]) \bmod M=\left\{\begin{array}{ll} s[r]-s[l-1], & s[r] \geq s[l-1] \\ s[r]-s[l-1]+M, & s[r]<s[l-1] \end{array}\right. (s[r]−s[l−1])modM={s[r]−s[l−1],s[r]−s[l−1]+M,​s[r]≥s[l−1]s[r]<s[l−1]​
从上述公式可以看出,加 o r or or 不加 M M M 取决于 s [ r ] s[r] s[r] 与 s [ l − 1 ] s[l - 1] s[l−1] 的大小情况。
这里,我们将 s [ r ] s[r] s[r] 与 s [ l − 1 ] s[l - 1] s[l−1] 的大小情况定义为一个命题。
那么,公式可以改写为:
( s [ r ] − s [ l − 1 ] )   m o d   M = s [ r ] − s [ l − 1 ] + M ∗ [ s [ r ] < s [ l − 1 ] ] (s[r]-s[l-1]) \bmod M=s[r]-s[l-1]+M *[s[r]<s[l-1]] (s[r]−s[l−1])modM=s[r]−s[l−1]+M∗[s[r]<s[l−1]] 将公式带入原题中可得:
∑ 1 ≤ l ≤ r ≤ N ( ( ∑ l ≤ i ≤ r A i ) m o d M ) = ∑ 1 ≤ l ≤ r ≤ N s [ r ] − s [ l − 1 ] + M ∗ [ s [ r ] < s [ l − 1 ] ] = ∑ 1 ≤ l ≤ r ≤ N ( s [ r ] − s [ l − 1 ] ) + ∑ 1 ≤ l ≤ r ≤ N M ∗ [ s [ r ] < s [ l − 1 ] ] = ∑ 1 ≤ l ≤ r ≤ N s [ r ] − ∑ 1 ≤ l ≤ r ≤ N s [ l − 1 ] + M ∑ 1 ≤ l ≤ r ≤ N [ s [ r ] < s [ l − 1 ] ] = ∑ r = 1 n s [ r ] × r − ∑ l = 1 n s [ l − 1 ] × ( n − l + 1 ) + M ∑ 1 ≤ l ≤ r ≤ N [ s [ r ] < s [ l − 1 ] ] \begin{aligned} \sum_{1 \leq l \leq r \leq N} \left( \left(\sum_{l \leq i \leq r} A_i\right) \mathbin{\mathrm{mod}} M \right) & =\sum_{1 \leq l \leq r \leq N} s[r]-s[l-1]+M *[s[r]<s[l-1]] \\ & =\sum_{1 \leq l \leq r \leq N}(s[r]-s[l-1])+\sum_{1 \leq l \leq r \leq N} M *[s[r]<s[l-1]] \\ & =\sum_{1 \leq l \leq r \leq N} s[r]-\sum_{1 \leq l \leq r \leq N} s[l-1]+M \sum_{1 \leq l \leq r \leq N}[s[r]<s[l-1]] \\ & =\sum_{r=1}^{n} s[r] \times r-\sum_{l=1}^{n} s[l-1] \times(n-l+1)+M \sum_{1 \leq l \leq r \leq N}[s[r]<s[l-1]] \end{aligned}\\ 1≤l≤r≤N∑​((l≤i≤r∑​Ai​)modM)​=1≤l≤r≤N∑​s[r]−s[l−1]+M∗[s[r]<s[l−1]]=1≤l≤r≤N∑​(s[r]−s[l−1])+1≤l≤r≤N∑​M∗[s[r]<s[l−1]]=1≤l≤r≤N∑​s[r]−1≤l≤r≤N∑​s[l−1]+M1≤l≤r≤N∑​[s[r]<s[l−1]]=r=1∑n​s[r]×r−l=1∑n​s[l−1]×(n−l+1)+M1≤l≤r≤N∑​[s[r]<s[l−1]]​
对于公式最后一行,进行一下解释。

从倒数第二行的公式可以看出来,在范围从 [ 1 , N ] [1, N] [1,N] 之间,我们要计算 s [ r ] s[r] s[r]时,可以看出每个 s [ r ] s[r] s[r]被计算 r r r次,每个 s [ l − 1 ] s[l - 1] s[l−1] 被计算 n − l − 1 n - l - 1 n−l−1 次。所以,倒数第二行公式可以简化为最后一行公式。然后再看一下倒数第二行的最后一个命题, l − 1 l - 1 l−1 是必然小于 r r r 的,但是呢? s [ r ] < s [ l − 1 ] s[r] < s[l -1] s[r]<s[l−1] ,这种形式很符合逆序对,所以只需要统计逆序对的个数,然后在乘上 M M M 就可以了。

这里,我们已经将公式化为最简了,接下来,看看代码如何编写吧。

typedef long long LL;
int n, m;
int a[N], s[N];

struct BIT{
	#define lowbit(x) ((x) & (-(x)))
	int tree[N];

	void add(int p, int x) {
		++ p;
		while(p < N) {
			tree[p] += x;
			p += lowbit(p);
		}
	}

	int query(int p) {
		++ p;
		if(p <= 0) return 0;

		int res = 0;
		while(p) {
			res += tree[p];
			p -= lowbit(p);
		}
		return res;
	}
}bit;


void solved() {
	/* your code */
	cin >> n >> m;
	for (int i = 1; i <= n; i ++) cin >> a[i];
	for (int i = 1; i <= n; i ++) s[i] = (s[i - 1] + a[i]) % m;

	LL ans = 0;
	for (int r = 1; r <= n; r ++) ans += s[r] * r * 1LL;
	for (int l = 1; l <= n; l ++) ans -= s[l - 1] * (n - l + 1) * 1LL;

	LL cnt = 0;
	for (int i = 1; i <= n; i ++) {
		cnt += i - 1 - bit.query(s[i]);
		bit.add(s[i], 1);
	}
	ans += cnt * m * 1LL;						
	cout << ans << endl;
}

总结

本题难度适中,重在考查对于树状数组的使用,这期间我们要简化我们的公式,这是重中之重。

标签:AtCoder,Beginner,Contest,int,sum,mathbin,leq,mathrm,mod
From: https://blog.csdn.net/weixin_55818116/article/details/143799279

相关文章

  • 【AtCoder】Beginner Contest 378-F.Add One Edge 2
    [题目链接](F-AddOneEdge2(atcoder.jp))ProblemStatementYouaregivenatreewithNNNvertices.Thei......
  • AtCoder Beginner Contest 380 A - E
    link赛时是ABC,D一眼要找规律,跳了,E题思路想了接近半个小时,然后发现假了,最后没调出来,问一下dalao发现其实很简单维护。。。基础线段树没切掉,哎呦不过发现比赛打多了,理解速度和手速都有些提高,幸好前三题秒掉了,要不然rating又会是一坨A-123233B-HurdleParsingC-M......
  • AtCoder Beginner Contest 380
    省流版A.计数判断即可B.计数统计即可C.模拟即可D.注意到字符串是左右大小写镜像,从长度大往小依次考虑实际所处的位置,维护镜像次数集合E.并查集维护连通性,并尝试与左右俩格子合并即可F.博弈\(dp\),状态数只有\(5e5\),直接记忆化搜索即可G.枚举打乱起始位置,全排列分......
  • Atcoder 11.17
    这是11.17号的题单4.第四题是字符串的问题,只需要找到规律即可,对于每个查询k[i],首先计算a和aa:a是(k[i]-1)//ls,即k[i]-1除以字符串长度ls的商。这相当于确定k[i]在重复字符串中属于第几个完整的字符串块。aa是bin(a).count("1")%2,即a的二进制表示中"1"......
  • 2021 Hubei Provincial Collegiate Programming Contest E. Revue
    题目描述n个人,每个人的初始分数不同(具体分数未知)有m次已知的Revue(按顺序发生),每次Revue形式为(x,y),意为x打败y,之后x的分变成二者max,y变成min现在你要按顺序在最后加入w次Revue,要保证在所有m+w次Revue中删掉任意k(k给出)次Revue后的所有初始分数的可能中,1都能获得最大分值最小......
  • 2021 Hubei Provincial Collegiate Programming Contest/2021湖北省赛 题解
    按解决顺序排列目录FAIDHECKJGBF二分答案ans,放最小的前ans个bi(变成必须放完)因为bi=2^k,所以小的放了可能会拆散大的空间,大的把小的地方占了的话小的可以塞其他地方,所以先放大的然后暴力能放则放,最多log次指针回到开头所以一次求解O(nlogn),总复杂度log^2A模拟,暴力枚举暴力异......
  • AtCoder Beginner Contest 380
    A-123233题意给个\(6\)位数,判断是否是\(1\)个\(1\),\(2\)个\(2\),\(3\)个\(3\)。思路模拟。代码点击查看代码#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongtypedefpair<int,int>pii;constintmxn=1e6+5;voidsolve(){ s......
  • AtCoder Grand Contests 杂做
    感觉AGC003及以前的题做了大部分,所以从AGC004开始,选一些我觉得合适的题做。AGC004E-*3200一直在往静态的几何(或者代数)限制想,结果没想到可以动态规划。为了更加直观可以看作出口在移动,然后到过的点加分,某些出界的点就被ban掉了。我们可以直接考虑定义\(f_{l,r,u,d}\)......
  • [Codeforces Round 987 (Div. 2)](https://codeforces.com/contest/2031)解题报告
    CodeforcesRound987(Div.2)太好了是阳间场,我们有救了感觉脑子生锈了qwq,F题做不出来A分析知如果有\(i<j\)且\(a_i>a_j\)的情况出现则\(i\)和\(j\)一定至少改一个。所以答案即为\(n-cnt\),\(cnt\)为众数个数。B发现一个数离自己原本的位置距离不会超过\(1\),有......
  • The 2024 ICPC Asia Nanjing Regional Contest
    Preface因为最近大家都有考试啥的,实在太久没训练了,只好在成都到郑州的火车上VP了一场顶着喧闹的车厢以及电脑只能放在腿上打的巨大Debuff,成功打出7题巨大罚时不过可惜的是4h后就没出题了,剩下的C,F瞪了半天是一个不会,甚至赛后看C的题解也搞不明白,只能说计数苦手是这......