<cstdio>
#include
<iostream>
#include
<fstream>
#include
<cstring>
#include
<string>
#define OP(s) cout<<#s<<"="<<s<<"
";
#define PP(s) cout<<#s<<"="<<s<<endl;
using
namespace std;
typedef
long long LL;
const
int LN =
50010,LM =
210;
inline
int getlen(int x)
{
if (x
< 10) return
10;
if (x
< 100) return
100;
if (x
< 1000) return
1000;
return
10000;
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("test.txt","r",stdin);
#endif
int n,k;
while (~scanf("%d %d",&n,&k))
{
static
int a[LN],len[LN];
memset(len,0,sizeof(len));
for (int i
=1 ;i
<= n;i++)
{
scanf("%d",a+i);
len[i] = getlen(a[i]);
}
LL ans = 0;
static LL f[2][LM];
bool now
= 1;
memset(f,0,sizeof(f));
for (int i
= 2;i
<= n;i++)
{
for (int j
= 0;j
< k;j++) if (f[!now][j])
{
f[now][(j*len[i]+a[i])%k]
+= f[!now][j]; ///! 手残1: (j*10 + a[i])%k
}
f[now][a[i]%k] +=
1;
ans += f[now][0];
now =
!now;
memset(f[now],0,sizeof(f[now]));
}
static
int seg1[LN],seg2[LN],num[LM],slen[LN];
seg1[0] =
0;
memset(num,0,sizeof(num));
int totlen
= 1;
for (int i
= 1;i
<= n;i++)
{
totlen = (totlen*len[i])%k;
slen[i] = totlen;
seg1[i] = (seg1[i-1]*len[i]+a[i])%k;
if (seg1[i]
== 0) ++ans; //if (seg1[i] == 0 && i != n) ++ans;
for (int j
= 0;j
< k;j++)
if ( (j*(totlen%k)
+ seg1[i])%k
== 0)
++num[j];
}
seg2[n] = a[n]%k;
///! 手残2:seg2[n+1] = 0;
totlen = 1;
for (int i
= n-1;i
>=
1;i--)
{
totlen = (totlen*len[i+1])%k; ///!手残脑残3:totlen
= a[n],totlen = (totlen*len[i])%k
seg2[i] = (a[i]*totlen
+ seg2[i+1])%k;
}
for (int i
= n;i >
1;i--)
{
int x
= seg2[i]%k;
for (int j
= 0;j
< k;j++)
if ( (j*(slen[i]%k)
+ seg1[i])%k
== 0)
--num[j];
ans += num[x]; ///! 手残脑残4: ans+= num[seg2[i]]
}
cout<<ans<<endl;
}
return
0;
}