题目链接:

数列

查询有多少\([l,r]\)区间满足每个数出现\(k\)的倍数次

即为\(1\)到\(r\)与\(1\)到\(l-1\)每个数相减的次数为\(k\)的倍数次

可以使用哈希维护

记录每个数出现的次数为\(cnt[x]\),哈希值为\(hash[x]\)

那么前缀哈希和即为\(\sum_{x} cnt[x]*hash[x]\)(\(cnt\)注意要模\(k\))

当我们循环到i时候,更新哈希值,查询得到的哈希值在之前map[hash]出现的次数

(\([l,r]\)区间的哈希值为0)

就可以得到以\(i\)结尾的符合条件区间的个数,从而得到答案

#include <bits/stdc++.h>
#define LL long long
#define ull unsigned long long
using namespace std;
const int N = 1e6 + 101;
int n, k;
int a[N];
ull hash[N], cnt[N], now;
map<ull,int>mp; ull rnd() { return (ull)rand() * (ull) rand() * (ull) rand(); } signed main()
{
srand(time(0));
scanf("%d%d",&n,&k);
for(int i = 1;i <= n; i++) hash[i] = rnd();
for(int i = 1;i <= n; i++) scanf("%d",&a[i]);
mp[0] ++;LL ans = 0;
for(int i = 1;i <= n; i++)
{
int x = a[i];
now -= cnt[x] * hash[x];
cnt[x] = (cnt[x] + 1) % k;
now += cnt[x] * hash[x];
ans += mp[now];
mp[now] ++;
}
cout << ans << endl;
}

最新文章

  1. ThinkPHP框架下的表单验证
  2. 前端 动态表单提交(post、put)
  3. C#_数据转换 实用方法
  4. 用javascript去掉字符串空格的办法
  5. [转]Java 内部类笔记
  6. LR:Code - 60990,Code - 10343 问题解决
  7. 处理div 在IE6 IE7 IE8 下不居中的问题
  8. LINUX打开文件
  9. 基于python的Splash基本使用和负载均衡配置
  10. classmethod 和 staticmethod
  11. 小程序movable-area置于顶层遮盖下方元素无法操作的解决方案
  12. FastDFS的单点部署
  13. java之map的基本介绍
  14. springboot报错Whitelabel Error Page
  15. Nginx反向代理及简单负载均衡配置
  16. stm8 io口重映射
  17. 分析jvm线程堆栈
  18. 解决Eclipse异常关闭后重启报 org.eclipse.swt.SWTException: Invalid thread access 的问题
  19. 一:Bootstrap-css样式
  20. 817C. Really Big Numbers 二分

热门文章

  1. 讲武德,你们要的高性能日志工具 Log4j2,来了
  2. mysql学习——数据表基本操作1
  3. 如何使用iMindMap制作更专业的时间计划
  4. 解决-Chrome插件安装时程序包无效:&quot;CRX_HEADER_INVALID&quot;
  5. 牛客练习赛69 火柴排队 题解(dp)
  6. 配置Nginx 扩展实现图片剪裁
  7. [BUGCASE]CI框架的post方法对url做了防xss攻击的处理引发的文件编码错误
  8. Spring Boot 2.4发布了,但Spring Cloud用户不推荐着急升级
  9. 从docker介绍及其简介
  10. Flink实战(102):配置(一)管理配置