C. Molly's Chemicals
题目链接:http://codeforces.com/problemset/problem/776/C
2.5 seconds
512 megabytes
standard input
standard output
Molly Hooper has n different kinds of chemicals arranged in a line. Each of the chemicals has an affection value, The i-th of them has affection value ai.
Molly wants Sherlock to fall in love with her. She intends to do this by mixing a contiguous segment of chemicals together to make a love potion with total affection value as a non-negative integer power of k. Total affection value of a continuous segment of chemicals is the sum of affection values of each chemical in that segment.
Help her to do so in finding the total number of such segments.
The first line of input contains two integers, n and k, the number of chemicals and the number, such that the total affection value is a non-negative power of this number k. (1 ≤ n ≤ 105, 1 ≤ |k| ≤ 10).
Next line contains n integers a1, a2, ..., an ( - 109 ≤ ai ≤ 109) — affection values of chemicals.
Output a single integer — the number of valid segments.
4 2
2 2 2 2
8
4 -3
3 -6 -3 12
3
Do keep in mind that k0 = 1.
In the first sample, Molly can get following different affection values:
- 2: segments [1, 1], [2, 2], [3, 3], [4, 4];
- 4: segments [1, 2], [2, 3], [3, 4];
- 6: segments [1, 3], [2, 4];
- 8: segments [1, 4].
Out of these, 2, 4 and 8 are powers of k = 2. Therefore, the answer is 8.
In the second sample, Molly can choose segments [1, 2], [3, 3], [3, 4].
题目大意:给出n个数,和一个数k,现在问你有多少个区间和等于k的x次方,x从0到无穷
思路:首先想到暴力算,遍历每个区间,但是看一下N的范围,显然行不通,那么仔细想一下题目要我们求什么:
求某个区间和是否是某个数的K倍 也就是说sum[r]-sum[l]=pow(K,X) 分析一下这个公式:也许你第一眼看到觉得这样的话 你还不是要N*N的复杂度,一样行不通啊
是的 这样看起来的确行不通,l 和 r 的取值范围是N 那么X呢? 数据最大只有10^14 那么就算K=2 2^X=1e14 不用我说 也知道X很小了吧 这就是这道题入手的关键了
总共就三个 我们遍历其中两个 另外一个是不是就出来了呢? 显然 是的
当然 r>l 这是必须的 所以我们不能把公式变为sum[r]=sum[l]+pow(K,X) 为什么呢? 因为我们要快速找到sum[r]这个值出现了几次 这样的话我们就判断不了这个值是在l之前出现的
还是在 l 之后出现的 。 所以我们把公式变为 sum[l]=sum[r]-pow(K,X) 这样我们刚开始不用存下所有的sum值 存sum[r]的同时存下sum[l] 这样会就保证了sum[l] 在sum[r]前面了
不知读者是否理解了 不理解的话 自己不妨试一下两种公式 自然会明白
本题还有一个坑点 就是K=-1或者1 的时候 所以我们要用set 来存储 排除pow相等的情况 防止多算了次数
看代码:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<map>
#include<set>
using namespace std;
typedef long long LL;
const int maxn=1e5+;
const LL INF=1e14+;
LL a[maxn];
LL sum[maxn];
map<LL,LL> m;
set<LL>p;
set<LL>::iterator it;
int main()
{
int N,K; scanf("%d%d",&N,&K);
for(int i=;i<=N;i++)
{
scanf("%lld",&sum[i]);
sum[i]+=sum[i-];
}
int D=;
LL f=;
for(int i=;i<=D;i++)
{
p.insert(f);
f*=K;
if(f>INF) break;
}
m[]=;
LL ans=;
for(int i=;i<=N;i++)
{
for(it=p.begin();it!=p.end();it++)
{
LL tmp=sum[i]-(*it);
ans+=m[tmp]; }
m[sum[i]]++;
}
cout<<ans<<endl;
return ;
}
C. Molly's Chemicals的更多相关文章
- Codeforces 776C - Molly's Chemicals(思维+前缀和)
题目大意:给出n个数(a1.....an),和一个数k,问有多少个区间的和等于k的幂 (1 ≤ n ≤ 10^5, 1 ≤ |k| ≤ 10, - 10^9 ≤ ai ≤ 10^9) 解题思路:首先, ...
- 【枚举】【前缀和】【map】ICM Technex 2017 and Codeforces Round #400 (Div. 1 + Div. 2, combined) C. Molly's Chemicals
处理出前缀和,枚举k的幂,然后从前往后枚举,把前面的前缀和都塞进map,可以方便的查询对于某个右端点,有多少个左端点满足该段区间的和为待查询的值. #include<cstdio> #in ...
- codeforces 776C Molly's Chemicals(连续子序列和为k的次方的个数)
题目链接 题意:给出一个有n个数的序列,还有一个k,问在这个序列中有多少个子序列使得sum[l, r] = k^0,1,2,3…… 思路:sum[l, r] = k ^ t, 前缀和sum[r] = ...
- C. Molly's Chemicals 暴力 + 统计技巧
http://codeforces.com/contest/776/problem/C 一开始做的时候,就发现是预处理前缀和,然后对于每一个前缀和,如果他能成为一个贡献,就是能和前面的某些段 组合成和 ...
- ICM Technex 2017 and Codeforces Round #400 (Div. 1 + Div. 2, combined) C. Molly's Chemicals
感觉自己做有关区间的题目方面的思维异常的差...有时简单题都搞半天还完全没思路,,然后别人提示下立马就明白了...=_= 题意:给一个含有n个元素的数组和k,问存在多少个区间的和值为k的次方数. 题解 ...
- 【codeforces 776C】Molly's Chemicals
[题目链接]:http://codeforces.com/contest/776/problem/C [题意] 让你找区间[i,j] 使得sum[i..j]=k^t,这里t=0,1,2,3.. -10 ...
- Codeforces 776C:Molly's Chemicals(思维)
http://codeforces.com/problemset/problem/776/C 题意:给出一个有n个数的序列,还有一个k,问在这个序列中有多少个子序列使得sum[l, r] = k^0, ...
- ICM Technex 2017 and Codeforces Round #400 (Div. 1 + Div. 2, combined)
前四题比较水,E我看出是欧拉函数傻逼题,但我傻逼不会,百度了下开始学,最后在加时的时候A掉了 AC:ABCDE Rank:182 Rating:2193+34->2227 终于橙了,不知道能待几 ...
- ICM Technex 2017 and Codeforces Round #400 (Div. 1 + Div. 2, combined) A map B贪心 C思路前缀
A. A Serial Killer time limit per test 2 seconds memory limit per test 256 megabytes input standard ...
随机推荐
- (转)IIS处理并发请求时出现的问题及解决
原文地址:http://www.cnblogs.com/hgamezoom/p/3082538.html 一个ASP.NET项目在部署到生产环境时,当用户并发量达到200左右时,IIS出现了明显的请求 ...
- HackThirteen 在onCreate()方法中获取View的宽度和高度
1.概要: Android源代码中很多模块都使用了post()方法,深入理解框架曾运行机制对于避开类似于本例中的小陷阱是很重要的 2.问题提出: 如果开发一些依赖于UI控件的宽和高的功 ...
- Sharepoint2013搜索学习笔记之搜索构架简单概述(一)
Sharepoint搜索引擎主要由6种组件构成,他们分别是爬网组件,内容处理组件,分析处理组件,索引组件,查询处理组件,搜索管理组件.可以将这6种组件分别部署到Sharepoint场内的多个服务器上, ...
- mysql 新建数据库与表
- .NET&C#的异常处理
应用程序未捕获异常的处理 处理未捕获的异常是每个应用程序起码有的功能 无论是Windows窗体程序还是WPF程序,我们都看到捕获的异常当中分为"窗体线程异常"和"非窗体线 ...
- spring mvc 框架启动报错:nested exception is java.lang.NoClassDefFoundError: org/w3c/dom/ElementTraversal 解决办法
今天准备将以前自己搭建的一个框架拿出来用一下,结果发现启动报错:nested exception is java.lang.NoClassDefFoundError: org/w3c/dom/Elem ...
- .db轻量级本地数据库
1.概述: db文件一般是数据库数据存放文件. db是datebase的缩写,是数据库文件. 我们可以简单的理解为db是本地轻量级数据库(用了缓存,储存少量本地数据,防止断电等突发意外的发生对我们的程 ...
- mysql 时间戳转换为日期
from_unixtime(time); from_unixtime(time,'%Y%m%d'); from_unixtime(time,'%Y年%m月%d日');
- MongoDB 副本集配置,开启账号认证
MongoDB 自带功能强大的主从,配置也很简单,从零开始花了30分钟搞定 3台以上机器IP: 192.168.1.24, 192.168.1.25, 192.168.1.26, 192.168.1. ...
- IT职场中外企面试最爱提的问题
1.请介绍一下你自己. 这是外企常问的问题.一般人回答这个问题过于平常,只说姓名.年龄.爱好.工作经验,这些在简历上都有,其实,外企最希望知道的是求职者能否胜任工作,包括:最强的技能.最深入研究的知识 ...