Nowcoder84D

Nowcoder84D

传送门

很有趣的进制转换题!

如果x满足题意,那么x+k-1一定能符合要求!

因为k-1用k进制表示就是1,-1,1+(-1)=0所以数位之和不变!

用map维护一下前缀和。就好了。

#include <iostream>
#include <map>
using namespace std;
typedef long long LL;
const int N=100002;
LL k,b,n;
LL a[N],s[N],s2[N];
map<LL,LL> mp,mp2;
int main() {
    scanf("%lld%lld%lld",&k,&b,&n); 
    for(int i=1;i<=n;i++) {
        scanf("%lld",&a[i]); 
        s2[i]=s2[i-1]+a[i]; mp2[s2[i]]++;
        a[i]%=(k-1); s[i]=s[i-1]+a[i]; s[i]%=(k-1);
        mp[s[i]] ++;
    }

    mp[0]++; mp2[0]++; 
    LL ret=0,zero=0;
    for(int i=0;i<=n;i++) {
        mp2[s2[i]] --;
        zero += mp2[s2[i]];
    }
    for(int i=0;i<=n;i++){
        mp[s[i]] --;
        ret += mp[(s[i]+b)%(k-1)];
    }    

    if (b==0) {
        ret = zero;
    }
    if (b==k-1) {
        ret -= zero;
    }
    cout<<ret<<endl;
}

转载于:https://www.cnblogs.com/RUSH-D-CAT/p/8974217.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值