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~10for (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 % kfor (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;
}