首页 > 其他分享 >优美子数列2 题解

优美子数列2 题解

时间:2024-07-26 14:54:24浏览次数:6  
标签:10 优美 前缀 pmod 题解 ll ans 数列

题目id:8628

题目描述

数学家小\(Q\)得到了一个长度为\(N\)的数列\(a_n\)。
小\(Q\)的幸运数字是\(k\),所以他认为,若一个子数列\(a_l,a_{l+1},...,a_r\)的和为\(k\)的倍数,则该子数列是优美子数列。
小\(Q\)现在想考考你,\(a_n\)里有多少个优美子数列呢?

前置知识

前缀和、桶

解题思路

因为是求某段区间的和,立马就能想到前缀和,可以\(O(1)\)求出\(a_l\sim a_r\)的和:
现在问题来了,\(n\)的范围不允许我们枚举\(\left[l,r\right](1\leq n\leq 2×10^5)\),若枚举,则时间复杂度为\(O(4×10^{10})\),绝对超时,那我们该如何枚举\(\left[l,r\right]\)呢\(?\)
为此,我们需要引入一个概念\(——\)桶。
桶,意义如其名,是用来存放各种数据的,那么桶在这道题目里有什么用呢?
现在有一个用来存放前缀和数组\((\)其实是变量啦\()\)\(\pmod k\)的余数的桶数组\(t\)。
Tip:由于\(a\)数组有可能全是负数,所以我们对负数取模需要用到一个特殊公式:\(a \pmod k=(a \pmod k+k)\pmod k\)

我们假设\((a \pmod k+k)\pmod k=y\)
如果\(y\)为\(0\),则\(ans\)直接加上当前余数为\(0\)的方案数\((\)又多了这么多组合\()\),也就是\(t_{0}\)
如果\(y\)不为\(0\),则\(ans\)直接加上当前余数为\(y\)的方案数\((\)两者中和\(y\)为\(0)\),也就是\(t_{y}\)
综上所述,对于每一项,得出公式如下:
ans+=t[(s[i]%k+k)%k]++;
另外,由于\(0\pmod k=0\),所以\(t_0=1\)
其中\(s_i\)为第\(i\)项的前缀和\((s\)也可以用变量啦\()\)
最后输出\(ans\)即可。

AC Code

#include<bits/stdc++.h>
#define Ios ios::sync_with_stdio(0),cin.tie(nullptr),cout.tie(nullptr)
#define ll long long
using namespace std;
ll n,k,ans,s,sum[500005],b[500005]={1};
int main()
{
    Ios,cin>>n>>k;
    for(ll i=1,a;i<=n;++i)cin>>a,s=((s+a)%k+k)%k,ans+=b[s]++;
    cout<<ans;
    return 0;
}

标签:10,优美,前缀,pmod,题解,ll,ans,数列
From: https://www.cnblogs.com/988176-/p/18325328

相关文章

  • 近期题解(2024.7.26)
    CF1070AFindaNumber一个朴素的想法是设\(dp_{x,y}\)表示模\(d\)为\(x\)且和为\(y\)的最小值,那么答案就是\(dp_{0,s}\)。自然初始状态为\(dp_{0,0}=0\),但是我们发现这个转移关系是带环的,所以说要把这个dp换成最短路。直接从\((0,0)\)为源跑一遍bfs即可,时间复......
  • 题解:Codeforces Round 961 (Div. 2) C
    C.Squaringtimelimitpertest:2secondsmemorylimitpertest:256megabytesinput:standardinputoutput:standardoutputikrpprppfoundanarray\(a\)consistingofintegers.Helikesjustice,sohewantstomake\(a\)fair —thatis,makeitnon......
  • 魔术上网导致Github push 443 问题解决方法
    问题描述使用“kexue上网”工具后,在IDEA中push代码到github时,报错:Failedtoconnecttogithub.comport443:Operationtimedout。同时,使用浏览器访问github也会出现无法访问,偶尔能访问的情况。解决办法gitconfig--globalhttp.proxyhttp://127.0.0.1:1087git......
  • 在整数列表中查找最长的重复非重叠整数序列
    我需要一个有效的代码来查找整数列表中最长的非重叠整数序列。我到处寻找,甚至询问了GPT4o,但没有找到解决这个相当简单但有趣的问题的好方法。如果有人可以帮助我改进它并检查它的准确性,我真的很感激!提前致谢。这是我到目前为止所得到的。这是非常低效和缓慢的,但......
  • 【题解】「CSP模拟赛」雨天 rain
    雨天rain考场上打了一个动态开点线段树,但是被卡空间了......
  • 最小循环节——题解
    最小循环节题目链接题意简述我们需要找到一个字符\(s\)的最短的循环节,对循环节的定义为,当一个字符串\(t\)能够通过若干次自己加自己得到字符串\(s\),我们就称\(t\)是\(s\)的一个循环节。思路简述根据题意,字符串\(s\)本身就是自己的一个循环节。所以,当我们找不到更......
  • 使用React脚手架时npx速度慢的问题解决
    React作为目前最流行的前端框架之一,其开发效率和组件化特性受到了开发者的广泛欢迎。然而在使用React脚手架工具,如create-react-app进行项目初始化时,有时会遇到npx命令执行速度非常慢的问题。本文将探讨这一问题的原因,并提供一些有效的解决方案。问题分析npx是Node.js包管......
  • P9304 「DTOI-5」3-1题解,c++树的遍历例题
    题意给定以n(1≤n≤1......
  • 题解:P10570 [JRKSJ R8] 网球(未成功)
    题目链接博客食用更佳:Myblog。这道题不是很难。提交记录分析:\(A\)每转\(a\)圈,\(B\)就转\(b\)圈,不考虑\(c\)的前提下,可知每个齿轮转了\([a,b]\)个齿,\(A\)有\([a,b]\diva\)个齿,\(B\)有\([a,b]\divb\)个齿,接着扩倍扩到都大于\(c\)。拓展:\[[a,b]=......
  • 题解:P10721 [GESP202406 六级] 计算得分(未成功)
    博客食用更佳:Myblog题目传送门分析:这道题是一个标准的dp。我们可以先预处理多个\(\texttt{abc}\)连成的字符串的最大值,之后可以按最长平台的方法处理。步骤:初值:这题不需要赋值,因为题目保证得分是正的,故初值为\(0\)。状态:\(dp_i\)表示连续\(i\)个\(\texttt{abc......