【分糖果】

article/2025/10/18 9:46:52

分糖果题目讲解

  • 题目描述
    • 输入格式
    • 输出格式
    • 数据范围
    • 输入样例1:
    • 输出样例1:
      • 样例1解释:
    • 输入样例2:
    • 输出样例2:
    • 输入样例3:
    • 输出样例3:
  • C++程序
    • 思路解析
    • 时间复杂度分析

在这里插入图片描述

题目描述

N N N 个盒子排成一排,第 i i i 个盒子里有 A i A_i Ai 个糖果。你需要从一些连续的盒子里取出糖果,分给 M M M 个小朋友,使得每个小朋友得到的糖果数量相等。求有多少种取法满足以下两个条件:

  • 取出的盒子数为 r − l + 1 r-l+1 rl+1,其中 1 ≤ l ≤ r ≤ N 1\le l\le r\le N 1lrN

输入格式

  • 第一行包含两个整数 N N N M M M
  • 第二行包含 N N N 个整数 A 1 , A 2 , … , A N A_1,A_2,\dots,A_N A1,A2,,AN

输出格式

输出一个整数,表示满足条件的取法数。

数据范围

  • 1 ≤ N ≤ 1 0 5 1\le N\le 10^5 1N105
  • 1 ≤ M ≤ 10 1\le M\le 10 1M10
  • 1 ≤ A i ≤ 1 0 9 1\le A_i\le 10^9 1Ai109

输入样例1:

3 2
4 1 5

输出样例1:

3

样例1解释:

符合条件的取法有 ( 1 , 3 ) , ( 2 , 3 ) , ( 3 , 3 ) (1,3),(2,3),(3,3) (1,3),(2,3),(3,3)

输入样例2:

13 17
29 7 5 7 9 51 7 13 8 55 42 9 81

输出样例2:

6

输入样例3:

10 400000000
1000000000 1000000000 1000000000 1000000000 1000000000 1000000000 1000000000 1000000000 1000000000 1000000000

输出样例3:

25

C++程序

#include <bits/stdc++.h>
using namespace std;
map<long long,int> mp;
long long n,m,x,sum,ans;
int main() {cin >>n >>m;mp[0]=1; // 初始化,表示前缀和为0的出现了1次for (int i=0; i<n; i++) {cin >>x;sum=(sum+x)%m; // 计算前缀和ans+=mp[sum]; // 更新答案mp[sum]++; // 更新前缀和出现次数}cout <<ans;return 0;
}

思路解析

  • 首先,我们需要计算出每个位置的前缀和,即前 i i i个数的和。然后,我们可以通过计算前缀和的差值,来得到任意一段连续的子数组的和。具体来说,如果我们要求第i到j个数的和,可以用前j个数的前缀和减去前 i − 1 i-1 i1个数的前缀和,即:
sum[i, j] = prefix_sum[j] - prefix_sum[i-1]
  • 接下来,我们要找到有多少个子数组的和是 M M M的倍数。我们可以将所有前缀和对 M M M取模,得到一个新的序列。我们要找的就是这个新序列中,有多少个不同的前缀和对 M M M取模后的值相同。因为如果两个前缀和对 M M M取模后的值相同,那么它们的差值一定是M的倍数,也就是说,它们对应的子数组的和一定是M的倍数。

  • 我们可以用一个哈希表来记录每个前缀和对M取模后的值出现的次数。具体来说,我们可以用一个 m a p < l o n g l o n g , i n t > map<long long, int> map<longlong,int>来表示,其中键是前缀和对 M M M取模后的值,值是该值出现的次数。我们可以从左到右遍历所有前缀和,每次遍历到一个前缀和时,我们就在哈希表中查找是否存在一个前缀和对 M M M取模后的值,使得当前前缀和减去该前缀和的值是 M M M的倍数。如果存在,那么我们就找到了一个符合要求的子数组。具体来说,如果当前前缀和对M取模后的值是 s u m sum sum,而之前已经有 c n t cnt cnt个前缀和对 M M M取模后的值是 s u m sum sum,那么我们就找到了 c n t cnt cnt个子数组的和是M的倍数。最后,我们要将当前前缀和对 M M M取模后的值出现的次数加 1 1 1,以便后续的查找。

时间复杂度分析

该算法的时间复杂度为 O ( n ) O(n) O(n),其中 n n n为输入的数的个数。因为我们只需要遍历一遍所有前缀和,并且每次查找哈希表的时间复杂度是 O ( 1 ) O(1) O(1)。空间复杂度为 O ( n ) O(n) O(n),因为我们需要用一个哈希表来记录每个前缀和对 M M M取模后的值出现的次数。


http://chatgpt.dhexx.cn/article/ExxeEgfr.shtml

相关文章

hdu 1205 :吃糖果

鸽巢原理 1.把某种糖果看做隔板,如果某种糖果有n个,那么就有n1块区域,至少需要n-1块其他种糖果才能使得所有隔板不挨在一块..也就是说能吃完这种糖果.至少需要其他种类糖果n-1块..(鸽巢原理) 2.数量最多的糖果(隔板)可以构造最多的空间,如果这种糖果有maxn个....那么需要maxn-1…

RecyclerView局部刷新

在RecyclerView中&#xff0c;我们时常会用到局部刷新&#xff0c;我们大多数是使用&#xff1a;notifyItemChanged。 我在使用这个局部刷新过程中突然发现我有几个notifyItemChanged没有效果&#xff0c;我就在&#xff1a; onBindViewHolder(NonNull ViewHolder holder, in…

android局部动态刷新,RecyclerView的局部刷新爬坑之路简述

RecyclerView的局部刷新爬坑之路简述&#xff0c;实际上RecyclerView做局部刷新是非常容易的&#xff0c;其实就是使用好带payload参数的这个notifyItemRangeChanged方法&#xff0c;以及override带payload的这个onBindViewHolder方法&#xff0c;在onBindViewHolder中去刷新你…

RecyclerView局部刷新机制

之前在使用RecyclerView的遇到过一个问题&#xff0c;使用notifyItemChanged刷新数据的时候会出现重影或者闪烁的现象。 这个问题很容易出现&#xff0c;当我们的列表中有进度显示&#xff08;比如下载&#xff09;&#xff0c;这时候需要不停的更新进度&#xff0c;就需要使用…

jsp java局部刷新_jsp怎么实现局部刷新

jsp实现局部刷新的方法&#xff1a;首先创建一个处理ajax请求的jsp文件&#xff1b;然后设置输出信息的格式及字符集&#xff1b;最后利用JSP和ajax来实现局部页面刷新即可。 通过 AJAX&#xff0c;JavaScript 可使用 JavaScript 的 XMLHttpRequest 对象来直接与服务器进行通信…

bootstrap切换tab页局部刷新_AdminLTE实现局部刷新

前言 AdminLTE是一个基于boostrap的前端模板,里面集成了好多插件,可以说方便又臃肿,毕竟不是所有插件都用得到,。好不容易找到个喜欢的前端模板,无奈每次点击菜单都会整个页面刷新一次,网上找了半天也没找到一个喜欢的局部刷新的解决方法。只好自己去啃js了。由于修改了原…

java局部刷新_HTML页面局部刷新的实现代码

这篇文章主要介绍了HTML页面局部刷新的实现代码的相关资料&#xff0c;写的十分的全面细致&#xff0c;具有一定的参考价值&#xff0c;对此有需要的朋友可以参考学习下。如有不足之处&#xff0c;欢迎批评指正。 事件响应刷新&#xff1a;有请求才会刷新 1、通过JS HTML DOM或…

原生JS局部刷新

目录 使用XMLHttpRequest对象进行异步请求&#xff1a; 2.使用fetch API进行异步请求 3.使用事件监听器进行局部刷新 4.servlet实现img验证码局部刷新 依赖jar包 Servlet login.jsp 在原生JS中&#xff0c;可以使用以下几种方式实现局部刷新&#xff1a; 使用XMLHttpReques…

html局部刷新数据,局部刷新.html

&#xfeff;局部刷新 $axure.utils.getTransparentGifPath function() { return resources/images/transparent.gif; }; $axure.utils.getOtherPath function() { return resources/Other.html; }; $axure.utils.getReloadPath function() { return resources/reload.html;…

flutter 局部刷新

目的&#xff1a;局部刷新 效果&#xff1a;点击右下角刷新按钮后&#xff0c;对九宫格中的图片刷新状态 思路&#xff1a;两个方法 一、整个页面都刷新&#xff0c;局部组件有变化&#xff0c;用UniqueKey() 二、只针对局部组件刷新&#xff0c;用GlobalKey() 具体操作&…

什么是局部刷新

局部刷新 浏览器在展示数据时&#xff0c;此时在窗口既可以看到本次的响应数据&#xff0c;同时又可以看到浏览器内存原有数据。 局部刷新原理&#xff1a; 不由浏览器发送请求给服务端 浏览器委托浏览器内存中一个脚本对象代替浏览器发送请求 这个行为导致服务端直接将…

【PSFTP】Windows从Linux获取文件或目录

1、安装Putty Win10先安装Putty 官方下载地址&#xff1a;http://www.putty.be/latest.html 安装后&#xff0c;Win10运行PSFTP 2、登录Linux 提示使用open host.name连接服务器 psftp: no hostname specified; use "open host.name" to connect psftp>参考…

putty、pscp、psftp 使用教程

如何从安装了Windows的工作电脑连远程接到Linux服务器?其实有很多软件,比如 PuTTY、XShell、CRT、MobaXterm等等。不过还是 PuTTY最简单易用、无需安装、并且开源免费。PuTTY其实是一个软件套装,里边除了最常用的putty之外,还包含了像 pscp、psftp等可以用于文件传输的工具…

putty和psftp命令行参数

putty和psftp命令行参数 https://the.earth.li/~sgtatham/putty/latest/w32/putty.zip https://the.earth.li/~sgtatham/putty/latest/w64/putty.zip https://the.earth.li/~sgtatham/putty/latest/puttydoc.zip https://the.earth.li/~sgtatham/putty/latest/putty-0.72.tar.g…

psftp

2019独角兽企业重金招聘Python工程师标准>>> 当连接到远程计算机以后&#xff0c;使用以下命令&#xff1a; bye 结束 psftp 。 cd 改变远程服务器的目录。 chmod 改变远程服务器的文件或文件夹的权限及属性。 del 删除远程服务器上的文件。 dir …

linux psftp,使用PSFTP实现Windows、Linux之间的文件传输

安装PuTTY时自动安装了PSFTP 使用PSFTP可以实现Winodws、Linux之间的文件传输。 打开PSFTP&#xff0c;输入Linux的ip地址&#xff0c;输入要登录的用户名、密码 Windows向Linux传文件&#xff1a; put D:\jdk-8u241-linux-x64.rpm /root/jdk-8u241-linux-x64.rpm put 本地文件…

putty以及psftp的基本操作,使用方法等

1、putty登陆远程服务器 open之后进入登陆界面&#xff0c;输入用户名之后点击Enter&#xff0c;之后输入登陆密码&#xff08;界面不显示&#xff0c;输入正确后直接Enter就可以&#xff09; 进入之后的界面 之后就可以输入命令进行操作了 2、文件传输psftp&#xff1a; 运行…

PSFTP工具的使用教程

PSFTP&#xff1a;是Putty的SFTP客户端&#xff0c;可以通过SFTP协议在两台电脑之间的传输文件。它和 PSCP相比的优点在于可以与服务器进行交互&#xff0c;遍历服务器上的文件系统&#xff0c;在一个会话中上传或下载多个文件。而 PSCP 只能一次传输一个文件&#xff0c;传输完…

Vector3.Lerp

Unity3D中的线性插值Lerp()函数解析 在unity3D中经常用线性插值函数Lerp()来在两者之间插值&#xff0c;两者之间可以是两个材质之间、两个向量之间、两个浮点数之间、两个颜色之间&#xff0c;其函数原型如下&#xff1a; Material.Lerp 插值 function Lerp(start : Materi…

Unity 的Vector3.Project 和 Vector3.ProjectOnPlane

目录 1.public static Vector3 Project(Vector3 vector, Vector3 onNormal); 描述 &#xff1a; 代码&#xff1a; 效果&#xff1a; 结论&#xff1a; 2.public static Vector3 ProjectOnPlane(Vector3 vector, Vector3 planeNormal);返回向量在平面上的位置。 描述 …