2068. 整数拼接 - AcWing题库
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int n,k;
int a[N];
int s[11][N]; //因为Ai <= 10^9 10^9 是一个10位数,所以要*10^10 才能拼接
int main()
{
cin >> n >> k;
for (int i = 1;i <= n;i++) cin >> a[i];
//预处理s[i][j]数组 表示(Aj * 10^i) % k 为 j 的个数 i从0~10
for (int j = 1;j <= n;j++)
{
int t = a[j] % k;
for (int i = 0;i <= 10;i++)
{
s[i][t]++;
t = t * 10 % k;
}
}
long long res = 0;
//枚举Ai , 查有多少个Aj 满足 (Aj * 10 ^ len(Ai) ) % k == -Ai % k
for (int i = 1;i <= n;i++)
{
int t = a[i] % k;
int len = to_string(a[i]).size();
res += s[len][(k-t)%k];
//判重 Ai = Aj 的情况减去
int r = t;
while (len--) r = r * 10 % k;
if (r == (k-t)%k) res--;
}
cout << res << '\n';
return 0;
}