列表

详情


NC15809. k进制数

描述

对于k进制数x,定义d(x)为x的各数位的和的k进制表示,如果结果超过一位,则继续重复执行各数位求和操作,直至结果为1位。
比如说,在7进制下,d(35047)=d((3+5+0+4)7)=d(157)=d((1+5)7)=d(67)=6
定义x为幸运的,当且仅当d(x) = b;
现在给定k进制下的n个数位a1 a2 an,问其中有多少子串组成的数字是幸运的。

输入描述

第一行三个整数k,b,n(2 <= k <= 1,000,000,000, 0 <= b < k, 1 <= n <= 100,000)。
第二行n个整数满足0 <= ai < k。

输出描述

输出一个整数表示幸运的子串数。

示例1

输入:

10 5 6
3 2 0 5 6 1

输出:

5

说明:

3 2
3 2 0
0 5
5
2 0 5 6 1
是幸运的。

示例2

输入:

7 6 4
3 5 0 4

输出:

1

示例3

输入:

257 0 3
0 0 256

输出:

3

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++14(g++5.4) 解法, 执行用时: 203ms, 内存消耗: 10212K, 提交时间: 2019-05-31 21:47:17

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=100005;
map<int,int>m;
int k,b,n,a[maxn];
int main()
{
	cin>>k>>b>>n;
	for(int i=1;i<=n;i++)
        cin>>a[i];
	ll ans=0;
	for(int i=1,pre=1;i<=n;i++)
	{
		if(a[i])pre=i+1;
		else ans+=i-pre+1;
	}
	if(b==0)
	{
		cout<<ans<<endl;
		return 0;
	}
	if(b==k-1)ans=-ans,b=0;
	else ans=0;
	m[0]=1;
	for(int i=1,res=0;i<=n;i++)
	{
		res=(res+a[i])%(k-1);
		ans+=m[(res-b+k-1)%(k-1)];
		m[res]+=1;
	}
	cout<<ans<<endl;
	return 0;
}

C++(clang++ 11.0.1) 解法, 执行用时: 128ms, 内存消耗: 14512K, 提交时间: 2023-07-19 15:43:36

 #include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+5;
ll k,b,n,a[N],s[N];
map<ll,ll>m;
int main()
{
	cin>>k>>b>>n;
	ll res=0,z=0,t=0;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		s[i]=(s[i-1]+a[i])%(k-1);
		if(a[i]==0)
			t++,z+=t;
		else
			t=0;
	}
	if(b==0)
	{
		cout<<z;
		return 0;
	}
	m[0]++;
	for(int i=1;i<=n;i++)
	{
		ll val=(s[i]-b+k-1)%(k-1);
		res+=m[val];
		m[s[i]]++;
	}
	if(b==k-1)
		res-=z;
	cout<<res;
	return 0;
}

上一题