AcWing 2068. 整数拼接
原题链接
中等
作者:
Bug-Free
,
2020-10-17 00:34:10
,
所有人可见
,
阅读 963
//
// Created by Genes on 2020/10/16.
//
// 整数拼接
// 优化
/* todo
*/
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long ll;
const int N = 100010;
int n, mod; // n 即题目中 n,mod 即上述 m
ll ans; // ans 存答案,由于最多会有 n ^ 2 中情况,所以需要开 ll
int a[N]; // a 存输入数据
int cnt[11][N]; // cnt 即上述数组 cnt
int get(int x) // 返回 1 + log10(x)
{
int res = 0;
while (x) x /= 10, res++;
return res;
}
void work() // 从前往后跑一遍
{
for (int i = 0; i < n; i++) {
ans += cnt[get(a[i])][(mod - a[i] % mod) % mod]; // 累加 cnt
for (int j = 0, power = 1; j < 11; j++) // 将 a[i] 的 0 ~ 10 次方 % mod 的结果计入 cnt
{
cnt[j][power * 1ll * a[i] % mod]++;
power = power * 10 % mod;
}
}
}
int main() {
scanf("%d%d", &n, &mod);
for (int i = 0; i < n; i++)
scanf("%d", a + i);
work();
memset(cnt, 0, sizeof cnt); //在第二次跑之前清空一下 cnt 数组
// 其实并不需要从前往后,从后往前写两遍。
// 只需要将数组反转一下,再从前往后跑一遍即可
reverse(a, a + n);
work();
printf("%lld\n", ans);
return 0;
}