题意:
给一个长度为
的字符串
,以及一个质数
,求有多少个子串在十进制下对可以整除
。
首先可以得知
,那么对于
子串,当且仅当
成立时,满足要求。
证明如下:
,若
,由于
,可以得出
,若
,显然
。
对
4 3进行特判,然后倒着遍历字符串,每次加上之前余数和当前余数相同的个数。
int m, p;
int ans, res, x;
int n, q, k, t;
string s;
int cnt[10005];
int main()
{
sdd(n, p);
cin >> s;
ans = 0;
if (p == 2 || p == 5)
{
rep(i, 0, n - 1)
{
if ((s[i] - '0') % p == 0)
ans += i + 1;
}
}
else
{
res = 0;
t = 1;
cnt[0] = 1;
per(i, n - 1, 0)
{
res = (res + (s[i] - '0') * t) % p;
ans += cnt[res]++;
t = t * 10 % p;
//pdd(res,t);
}
}
pd(ans);
return 0;
}