#include<bits/stdc++.h>
using namespace std;
long long int getweishu(long long int a) { //获取a是多少位数
long long int num = 0;
while (a / 10 != 0) {
num++;
a = a / 10;
}
num++;
return num;
}
int main() {
int begin1 = 1, begin2 = 1;
long long int n, K;
long long int num = 0, one = 0, allone = 0;
cin >> n >> K;
long long int a[10000] = {}, c[10000] = {}, d[10000] = {};
int i, j, temp;
for (i = 1; i <= n; i++) {
cin >> a[i];
}
for (i = 1; i <= n; i++) { //初始化a[i]是否可以被K整除
if (a[i] % K == 0) {
//将可被整除的数放进d中,begin2为c中数的个数
d[begin2++] = a[i];
one++;
}
else {
//将不可被整除的数放进c中,begin1为c中数的个数
c[begin1++] = a[i];
}
}
for (i = one - 1; i >= 1; i--) { //可被整除的数之间相互组合的种数
allone += i;
}
allone = 2 * allone; //所有可被除的组合起来的种数
long long int zhishu = 0;
for (i = 1; i < begin1; i++) { //c不可整除
for (j = 1; j < begin2; j++) { //d可整除
zhishu = getweishu(d[j]);
long long int x = c[i] * pow(10, zhishu);
//不可整除的数后面连接上可整除的数,然后判断是否可被整除
if ((x + d[j]) % K == 0) {
num++;
}
}
}
int zhishu1,zhishu2;
long long int temp1,temp2;
for(i=1;i<begin1;i++){
for(j=i+1;j<=begin1;j++){
zhishu1=getweishu(c[i]);
zhishu2=getweishu(c[j]);
temp1=c[i]*pow(10,zhishu2)+c[j];
temp2=c[i]+c[j]*pow(10,zhishu1);
if(temp1%K==0){
num++;
}
if(temp2%K==0){
num++;
}
}
}
num += allone;
cout << num;
return 0;
}
#include<bits/stdc++.h>using namespace std;long long int getweishu(long long int a) { //获取a是多少位数 long long int num = 0; while (a / 10 != 0) { num++; a = a / 10; } num++; return num;}int main() { int begin1 = 1, begin2 = 1; long lon.