🤠 整数拼接
🤠 参考链接
4 2
1 2 3 4
输出样例
6
🤠 思路
拼接模拟:
假设 a: 123, b: 456 拼接,两种情况
① 123456:可以看成 123 * 10^(b的位数 3 ) + 456
② 456123:可以看成 456 * 10^(a的位数 3 ) + 456
取模模拟:
(a * (10^b的位数) + b) % k == 0
移项化简
a * (10^b的位数) % k == -b % k
好啦,现在只要预处理出 a * (10^b的位数) % k 的所有方案,然后再枚举 -b % k 判断一下就ok啦
需要注意的是,这种做法并不排除 a b 是同一个数的方案,得多写一步去重
import java.io.*;
import java.util.*;
public class Main
{
static int N = 100010, n, k;
static long[] a = new long[N];
static long[][] s = new long[12][N];
static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
static BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out));
public static void main(String[] args) throws IOException
{
String[] split = in.readLine().split(" ");
n = Integer.parseInt(split[0]);
k = Integer.parseInt(split[1]);
// 输入数据
String[] split2 = in.readLine().split(" ");
for (int i = 0; i < n; i++)
{
a[i] = Long.parseLong(split2[i]);
}
// 预处理数组
for (int i = 0; i < n; i++)
{
long t = a[i] % k;
for (int j = 0; j < 11; j++)
{
s[j][(int) t]++;
t = t * 10 % k;
}
}
long res = 0;
for (int i = 0; i < n; i++)
{
long t = a[i] % k;
int len = String.valueOf(a[i]).length();
res += s[len][(int) ((k - t) % k)];
// 去重
long r = t;
while (len-- > 0)
r = r * 10 % k;
if (r == (k - t) % k)
res--;
}
System.out.println(res);
}
}