此题用到了非常好的数字的性质 /*一个正数的digit root(k进制下,直到得到小于k的数) 等于 正数模k-1(其中k为进制),但是对于digit root为k-1的情况模k-1后即为0*/#includecstdio#includemap#includec
此题用到了非常好的数字的性质
/*一个正数的digit root(k进制下,直到得到小于k的数) 等于 正数模k-1(其中k为进制),但是对于digit root为k-1的情况模k-1后即为0*/
#include<cstdio>
#include<map>
#include<cstring>
typedef long long ll;
using namespace std;
int main(){
int k,b,n;
int i,tem;
map<int,int>m;
ll sum1=0,sum2=0,now=0,mod=0;
scanf("%d %d %d",&k,&b,&n);
m[0]=1;
for(i=1;i<=n;i++){
scanf("%d",&tem);
if(tem)
now=0;
else{
now++;
sum1+=now;
}//这个判断记录digit root为0的子串个数(digit rooot为0只能是此数为0)
mod=(mod+tem)%(k-1);//这里就从第一位到现在所组成的数模k-1的值
sum2+=m[(mod-b+k-1)%(k-1)];//若b=k-1则这里求的是m[0]的值
m[mod]++;
}
if(b==0)
printf("%I64d\n",sum1);
else if(b==k-1)
printf("%I64d\n",sum2-sum1);
else
printf("%I64d\n",sum2);
return 0;
}