codeforces 776C Molly's Chemicals(连续子序列和为k的次方的个数)
2024-08-31 10:13:32
题意:给出一个有n个数的序列,还有一个k,问在这个序列中有多少个子序列使得sum[l, r] = k^0,1,2,3……
思路:sum[l, r] = k ^ t, 前缀和sum[r] = sum[l-1] + k^t。即如果后面有一段序列使得sum[l,r] = k^t,那么它可以转化为前缀和相减使得这一段大小为k^t,即sum[i] = sum[j] + k^t (1 <= j < i)。
那么对于处理好的每一个前缀和,直接往后面加上k^t(0<=t<=x,k^x是不超过题目范围的数)。然后在后面遍历的时候直接加上对应那个数的权值。
因为数据很大,所以只能用map来装权值。
代码实现:
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll f[];
ll k_t[];
int main()
{
int n,k,i,j,cnt;
while(cin>>n>>k)
{
map<ll,int>mp;
memset(f,,sizeof(f));
memset(k_t,,sizeof(k_t));
for(i=;i<=n;i++)
{
cin>>f[i];
f[i]+=f[i-];
}
k_t[]=;cnt=;
if(k==-)k_t[]=-,cnt++;
else if(k!=)
{
ll temp=k;
while(temp<1e15)
{
k_t[cnt++]=temp;
temp*=k;
}
}
ll ans=;
for(i=;i<cnt;i++)mp[k_t[i]]=;
for(i=;i<=n;i++)
{
if(mp[f[i]])ans+=mp[f[i]];
for(j=;j<cnt;j++)
mp[f[i]+k_t[j]]++;
}
cout<<ans<<endl;
}
return ;
}
最新文章
- pylot是一款开源的web性能测试工具
- JSP+Servlet中使用cos.jar进行图片上传(文件上传亦然)
- static 与 final 修饰符
- javascript-权威指南读书笔记(1)
- LiangNa Resum
- CentOS7.0分布式安装HADOOP 2.6.0笔记-转载的
- 手机自动化测试:appium源码分析之bootstrap十四
- JAVA中的四种引用以及ReferenceQueue和WeakHashMap的使用示例
- jQuery给表单设置值
- 深入浅出AQS之独占锁模式
- Delphi 项目配置选项
- 一键安装Davinci
- 使用Intellij IDEA将web项目导出为war包
- 使用redis-cli --pipe快速插入数据
- Android精通:TableLayout布局,GridLayout网格布局,FrameLayout帧布局,AbsoluteLayout绝对布局,RelativeLayout相对布局
- ERP采购业务(三十七)
- JAVA里的VO、BO、PO分别指什么?
- 什么是Less、typescript与webpack?
- Android 获取闹钟引发的血案
- Spring+Quartz的版本问题