hdu 6794 Tokitsukaze and Multiple 前缀和思想+思维
2024-10-19 19:44:06
题意:
t组输入,给你一个长度为n的数组,你每次可以从数组中找到a[i]和a[i+1],然后用a[i]+a[i+1]这个新元素来覆盖掉a[i]和a[i+1]的位置(1<=i<n),从而数组长度也减去1
你可以进行任意次这样的操作,输出最后的数组中有多少数,是p的倍数
题解:
给你一个a数组的前缀和数组w,我们保证a[i]>=1,前缀和w[i]都被p取余过
假设i<j,那么如果w[i]和w[j]相等,那也就是说(a[i+1]+a[i+2]+...+a[j])%p == 0,也就是说这一段是p的倍数
那么我们就可以依靠这一点去做题
我们先判断一下v[i]%p==0的点,然后依次这些点把原数组分割,分别对每一段进行上面这样的判断
代码:
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <vector>
#include <map>
#include <queue>
#include <stack>
#include <set>
#include <ctime>
#include <cstring>
#include <cstdlib>
#include <math.h>
#include<map>
using namespace std;
typedef long long ll;
const int maxn = 3e5 + 5;
ll v[maxn];
map<ll,ll>r;
int main()
{
ll t;
scanf("%lld",&t);
while(t--)
{
ll n,p;
r.clear();
scanf("%lld%lld",&n,&p);
// ll vis[p+5];
// memset(vis,0,sizeof(vis));
for(ll i=1; i<=n; ++i)
scanf("%lld",&v[i]),v[i]%=p;
ll sum=0,mod=0;
r[0]=1;
for(ll i=1; i<=n; ++i)
{
if(v[i]==0)
{
mod=0;
r.clear();
sum++;
r[0]=1;
}
else
{
mod=(mod+v[i])%p;
r[mod]++;
if(r[mod]>=2)
{
mod=0;
sum++;
r.clear();
}
r[0]=1;
}
}
printf("%lld\n",sum);
}
return 0;
}
最新文章
- UML类图(下):关联、聚合、组合、依赖
- windows 中去除Ctrl+Alt+Del才能登录
- Java基础系列——IO流
- KVM 虚拟化 初体验
- 【解题报告】zju-1030 Farmland
- memcache和memcahced区别
- 工作总结:文件对话框的分类(C++)
- slave 成为master 时候执行的操作notify_master /etc/keepalived/send_master.sh
- 深入探索C++对象模型-语义
- 第十六节,基本数据类型,字典dict
- MongoDB Java Driver 3.4操作
- 【Aho-Corasick automation 大米饼模板】
- Python学习笔记4基本数据类型
- vue 构建项目vue-cli
- C++类构造函数初始化列表(转)
- 4.Kali 1.0 / 2.0 安装中文输入法(谷歌pinyin + 其他)
- 阿里云提出的漏洞(Phpcms V9某处逻辑问题导致getshell漏洞解决方法)的问题
- __lll_mutex_lock_wait的错误原因
- mysql数据库优化课程---14、常用的sql技巧
- 我的Android进阶之旅------>解决Error:Unable to find method 'org.gradle.api.internal.project.ProjectInternal.g