AcWing 2068. 整数拼接 java 模拟 新手友好篇

🤠 整数拼接

🤠 参考链接

在这里插入图片描述
在这里插入图片描述

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);
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值