博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
D-【乐】k进制数(同余)
阅读量:4933 次
发布时间:2019-06-11

本文共 1239 字,大约阅读时间需要 4 分钟。

题目

做法

\((x)_k\)定义编号,如果\(a+b\)加到一起能进一位,\(a+b\rightarrow 1+(a+b-k)=a+b-(k-1)\),故\(d(a_{l,r})=\sum\limits_{i=l}^r a_i\% k-1\)

但我们发现\(k-1\)这一块缺失了,显然为\(0\)当且仅当区间均为\(0\),其他情况得出\(0\)的时候实际结果为\(k-1\)

  • \(b=0\):全\(0\)区间个数

  • \(b=k-1\):满足\(/%(k-1)=0\)的个数-全\(0\)区间个数

  • 其他情况:\(a_{l,r}=sum_r-sum_{l-1}\%(k-1),sum_r-sum_{l-1}\equiv b (\%k-1),sum_r-b\equiv sum_{l-1}(\%k-1)\)

    Code

#include
typedef long long LL;const LL maxn=1e6+9;inline LL Read(){ LL x(0),f(1); char c=getchar(); while(c<'0' || c>'9'){ if(c=='-') f=-1; c=getchar(); } while(c>='0' && c<='9'){ x=(x<<3)+(x<<1)+c-'0'; c=getchar(); }return x*f;}LL k,b,n,ret,num,ze;LL a[maxn],sum[maxn];std::map
cnt;int main(){ k=Read(); b=Read(); n=Read(); for(LL i=1;i<=n;++i) a[i]=Read(); for(LL i=1;i<=n;++i){ sum[i]=(sum[i-1]+a[i])%(k-1); if(!a[i]){ ++num; ze+=num; }else num=0; } if(!b){ printf("%lld\n",ze); return 0; } cnt[0]++; for(LL i=1;i<=n;++i){ LL val((sum[i]-b+k-1)%(k-1)); ret+=cnt[val]; ++cnt[sum[i]]; } if(b==k-1) ret-=ze; printf("%lld\n",ret); return 0;}

转载于:https://www.cnblogs.com/y2823774827y/p/10957899.html

你可能感兴趣的文章
bzoj3396 [Usaco2009 Jan]Total flow 水流
查看>>
20165231 2017-2018-2 《Java程序设计》第3周学习总结
查看>>
(180905)如何通过梯度下降法降低损失----Google机器学习速成课程笔记
查看>>
(响应式PC端媒体查询)电脑屏幕分辨率尺寸大全
查看>>
Crystal Reports拉报表报错:Error detected by database DLL
查看>>
Java获取新浪微博cookies
查看>>
面试题总结
查看>>
【BZOJ1095】捉迷藏(动态点分治)
查看>>
Table Basics [转载]
查看>>
Logback 学习笔记
查看>>
并查集
查看>>
11、组件注册-使用FactoryBean注册组件
查看>>
nyoj_95_众数问题_map练习
查看>>
uchome 是如何将数据插入数据库的
查看>>
For循环
查看>>
020-安装centos6.5后的生命历程
查看>>
面试介绍项目经验(转)
查看>>
创建并设置ASP.NET的会话状态服务器(SQL State Server)
查看>>
<metro>Google的验证
查看>>
SQL中NUMERIC和DECIMAL的区别
查看>>