题目: 传送门
Code:
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <vector>
#include <map>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn = 100007;
int n, k;
int arr[maxn];
int mp[11][maxn];
ll cnt = 0;
inline int get_len(int x) {
int ans = 0;
while (x) {
x/=10;
ans++;
}
return ans;
}
void func() {
for (int i=0;i<n;i++) {
cnt += mp[get_len(arr[i])][(k - arr[i]%k)%k];
for (int j=1, t=10;j<11;j++) {
mp[j][((arr[i]%k) * 1ll * (t%k)) % k]++;//就算模了k,两个10^5相乘还是会爆long long
//mp[i][j] 表示arr[0]到arr[i]中所有乘上10^i后 模 k 等于j的数的个数
t = 10*t % k;
}
}
}
int main()
{
scanf("%d %d", &n, &k);
for (int i=0;i<n;i++) {
scanf("%d", &arr[i]);
}
func();//保证i<j, 用arr[i]和arr[j]拼
reverse(arr, arr+n);
memset(mp, 0, sizeof(mp));
func();
printf("%lld\n", cnt);
return 0;
}