codeforce D. Concatenated Multiples
http://codeforces.com/contest/1029/problem/D
看C题的第一眼就觉得自己一定能做出来,结果就兴致勃勃地做了一天,最后做出来了。但看到这道题时,第一感觉就是“好难啊,我肯定做不出来,而且还是数学题,我从没做出过一道数学题”,默念1分钟丧气话,1分钟后正式放弃了。
我很惊讶,1天的时间不能让我放弃,1分钟却让因为刚通过C题十分兴奋的我放弃了,我觉得自己很神奇= =。然后我就打算,先不管过不过得了,一天之后再放弃,然后我第二天早上就过了……
目标是:O(n)
让我们先举个例子:a1、a2、a3、mod。把a1放在字符串最右边,a2、a3放在字符串左边,那么左边的字符串的余数的贡献是确定的,当a1%mod==0时,find=0,否则find=mod-a1%mod
我们要做的就是把a2、a3扩大a1.length()后的余数提前处理出来,在遍历的时候查找有没有值等于find。设b[len][n],第一个下标是a数组所有出现的长度,第二个下标是把a0~an-1全部扩大第一个下标后%mod的值。遍历时,直接找b[ai_len][]里有几个值等于find,累加结果
但我们的b[ai_len][]里包含了ai本身,也就是我们计算了(a1+“”+a1)%mod的情况,因为这种情况的贡献为1,到最后减去就可以了
还有溢出的问题,用bigInteger解决。我们采用计算机内部判断溢出的方案:应该是正的却为负,应该是负的却为正。
当b为二维数组时,会有这样的情况 b[1]={1,1,1,1,1}。如果1==find,那么我们要计算所有1的数量,于是我把b变成HashMap类型,key是值,value是个数,这样就可以直接计算了
1 import java.math.BigInteger;
2 import java.util.*;
3
4 public class A {
5 public static void main(String[] args) {
6 Scanner io = new Scanner(System.in);
7 int n = io.nextInt(), a = io.nextInt();
8 BigInteger bigA = new BigInteger(a + "");
9 long[] b = new long[n];
10 int[] c = new int[n];
11 long[] pow = new long[15];
12 String[] pow2 = new String[15];
13 HashSet<Integer> set = new HashSet<>();
14 pow[0] = 1;
15 pow2[0] = "";
16 for (int i = 1; i < pow.length; i++) {
17 pow[i] = pow[i - 1] * 10;
18 pow2[i] = pow2[i - 1] + "0";
19 }
20 long ans = 0;
21
22 for (int i = 0, t; i < n; i++) {
23 t = io.nextInt();
24 b[i] = t % a;
25 c[i] = (t + "").length();
26 set.add(c[i]);
27 }
28
29 HashMap<Long, Long>[] map = new HashMap[pow.length];
30 for (int l : set) {
31 map[l] = new HashMap();
32 for (int i = 0; i < n; i++) {
33 long m = (1L * (b[i] % a) * pow[l] % a);
34 if (m < 0) {
35 BigInteger big = new BigInteger(b[i] + pow2[l]);
36 m = big.mod(bigA).longValue();
37 }
38 map[l].put(m, map[l].getOrDefault(m, 0L) + 1);
39 }
40 }
41
42 for (int i = 0; i < n; i++) {
43 long find = b[i] == 0 ? 0 : a - b[i];
44 if (!map[c[i]].containsKey(find)) continue;
45 long cnt = map[c[i]].get(find);
46 long t = 1L * (b[i] % a) * pow[c[i]] % a;
47 if (t < 0) {
48 BigInteger big = new BigInteger(b[i] + pow2[c[i]]);
49 t = big.mod(bigA).longValue();
50 }
51 //减去(a1+“”+a1)%mod的贡献
52 if (t == find) cnt--;
53 ans += cnt;
54 }
55 System.out.println(ans);
56 }
57 }
codeforce D. Concatenated Multiples的更多相关文章
- D. Concatenated Multiples 解析(思維)
Codeforce 1029 D. Concatenated Multiples 解析(思維) 今天我們來看看CF1029D 題目連結 題目 給你一個序列\(a\)和一個數字\(k\),求有幾種ind ...
- Codeforces Round #506 (Div. 3) D. Concatenated Multiples
D. Concatenated Multiples You are given an array aa, consisting of nn positive integers. Let's call ...
- D. Concatenated Multiples(离线处理)
思路:直接离线处理出每个ai 的10倍, 100倍, 1000倍的mod k 后的数值的个数,使用map<int,int >ss[12]存储, ss[x][y]表示 (ai*10x)%k= ...
- Codeforces | CF1029D 【Concatenated Multiples】
\(qwq\)昨天晚上\(Div.3\)过了这道题...早上交了\(1A\)...看在\(CF\)上\(hack\)的情况并不乐观而且也没人来交这题的份上...我决定发一篇题解帮\((zhuang)\ ...
- Codeforces Round #506 D. Concatenated Multiples题解
一.传送门 http://codeforces.com/contest/1029/problem/D 二.题意 给你$N$个数字$a_1,a_2,\cdots,a_n$,一个$K$,求所有$i \ne ...
- CodeForces D. Concatenated Multiples
http://codeforces.com/contest/1029/problem/D You are given an array aa, consisting of nn positive in ...
- Codeforces Round #506 (Div. 3) - D. Concatenated Multiples(思维拼接求是否为k的倍数)
题意 给你N个数字和一个K,问一共有几种拼接数字的方式使得到的数字是K的倍数,拼接:“234”和“123”拼接得到“234123” 分析: N <= 2e5,简单的暴力O(N^2)枚举肯定超时 ...
- Codeforces Round #506 (Div. 3) 1029 D. Concatenated Multiples
题意: 给定n个数字,和一个模数k,从中选出两个数,直接拼接,问拼接成的数字是k的倍数的组合有多少个. 思路: 对于a,b两个数,假定len = length of (b),那么a,b满足条件就是a ...
- Codeforces Round #506 (Div. 3) 题解
Codeforces Round #506 (Div. 3) 题目总链接:https://codeforces.com/contest/1029 A. Many Equal Substrings 题意 ...
- Codeforces Round #506 (Div. 3) D-F
Codeforces Round #506 (Div. 3) (中等难度) 自己的做题速度大概只尝试了D题,不过TLE D. Concatenated Multiples 题意 数组a[],长度n,给 ...
随机推荐
- Hive详解(05) - 压缩和存储
Hive详解(05) - 压缩和存储 Hadoop压缩配置 MR支持的压缩编码 压缩格式 算法 文件扩展名 是否可切分 DEFLATE DEFLATE .deflate 否 Gzip DEFLATE ...
- python之路56 dajngo最后一天 csrf跨站请求 auth模块登录注册方法
csrf跨站请求伪造 钓鱼网站:模仿一个正规的网站 让用户在该网站上做操作 但是操作的结果会影响到用户正常的网站账户 但是其中有一些猫腻 eg:英语四六级考试需要网上先缴费 但是你会发现卡里的钱扣了但 ...
- Python 跨模块使用全局变量(自定义类型)
gol.py def _init():#初始化 global _global_dict _global_dict = {} def set_value(key,value): "" ...
- STM32 的学习方法
前言 学习知识要掌握有效的学习方法,学习技术也是一样,本篇分享关于我学习 STM32 后总结的学习方法. 推荐的学习方法 系统学习 在网上购买一款开发板,使用开发板+开发板配套视频教程+开发板配套源码 ...
- DVWA系列2:SQL Injection
DVWA系列2:SQL Injection 前言 SQL 注入是比较常见的攻击类型,之前一直听说过,也尝试看过一些教程,但其中的单引号,字符串拼接等感觉有点抽象,不知道为什么要这么做.这次就使用 DV ...
- 从0开始学习VUE3--01-Vue2与Vue3的不同点
升级带来的性能提升总结 1.模板编译优化:节点达到一定个数,会自动优化 每次重新渲染,会调用createVnode创建虚拟节点,VUE3会做静态提升,静态节点进行提取,进行优化 2.事件 缓存事件,防 ...
- Google Cloud Platform | 使用 Terraform 的分层防火墙策略自动化
[本文由Cloud Ace整理发布,更多内容请访问Cloud Ace 官网] 防火墙规则是 Google Cloud 中网络安全的重要组成部分.Google Cloud 中的防火墙大致可分为两种类型: ...
- 穿透的switch语句-循环概述与基本组成部分
穿透的switch语句 在switch语句中,如果case的后面不写break,将出现穿透现象,也就是不会在判断下一个case的值,直接向后运 行,直到遇到break,或者整体switch结束. pu ...
- 你想成为.Net 7的技术高手吗?来这里看看
前言: 你是否时常觉得,整天搞些Curd和增删改查.这些毫无意义的东西,完全是浪费生命.想要进阶,成为高手.却苦于找不到方法,没有一套系统性的东西. 有鉴于此,新建了一个群,方便大家一起交流和分享一些 ...
- 程序员大杀器?带你玩转ChatGPT
作者:京东零售 栗鸿宇 ChatGPT简介 ChatGPT是一款基于AI技术的机器人对话软件,它能够与用户进行智能化的聊天对话,帮助用户解决日常生活中的问题,为用户提供丰富的信息和服务.它集成了海量知 ...