cf 1029D
题面
题目描述
给定含n个整数的数组a。
规定数x,y的合并为xy。如:数12与数3456的合并为数123456。
有数组中的位置对(i,j)(i≠j),计算使ai,aj的合并能被k整除的位置对数量。
输入
第一行输入整数n,k (1≤n≤2*10^5,2≤k≤10^9)
第二行输入含n个整数的数组a1,a2,a3,...,an (1≤ai≤10^9)
输出
输出位置对(i,j)的数量,使ai,aj的合并能被k整除
样例输入1
6 11
45 1 10 12 11 7
样例输出1
7
样例输入2
4 2
2 78 4 10
样例输出2
12
样例输入2
5 2
3 7 19 3 3
样例输出2
0
提示
样例输出1中,有位置对(1,2),(1,3),(2,3),(3,1),(3,4),(4,2),(4,3),使所得数451,4510,110,1045,1012,121,1210能被11整除。
样例输出2中,全体位置对所得数都能被2整除。
样例输出3中,全体位置对所得数都不能被2整除。
题解
两数合并有计算公式$conc(a_i ,a_j ) = a_i \cdot 10^{len[j]} + a_j$ (len[j]表示的位数)
若暴力枚举,时间复杂度达$O(n^2 )$,必超时。可以想到用利用计算公式分解两数的模,计算$a_j$的模并排序,枚举$a_i \cdot 10^{len[j]}$取模并二分查找对应$a_j$的模的数量。这样就利用了排序与二分查找,减少了逐个枚举$a_j$部分的时间。
根据题意可知$(a_i \cdot 10^{len[j]} + a_j {\rm{) mod }}k = 0$,顺推得到$({\rm{ }}(a_i \cdot 10^{len[j]} {\rm{ mod }}k) + (a_j {\rm{ mod }}k{\rm{) ) mod }}k = 0 \Leftrightarrow k - (a_i \cdot 10^{len[j]} {\rm{ mod }}k) = a_j {\rm{ mod }}k$。细节上,由于数组a中数的长度参差不齐,于是可以用“mod”二维数组存放长度为len[i]的数 mod k的值并排序。接着i=1 to n,j=1 to 10枚举$a_i \cdot 10^j$部分,用lower_bound、upper_bound查找符合题意的低位部分的区间,累加这个区间即得到答案。
最终将时间复杂度$O(n^2 )$缩短为$O(10 \cdot n\log n)$。
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
int n, k;
int a[],len[];
int mod[][], mod_10[];
int cnt[]; int main()
{
scanf("%d%d", &n, &k);
for (int i = ; i <= n; i++)
scanf("%d", a + i);
mod_10[] = ;
for (int i = ; i < ; i++)
mod_10[i + ] = mod_10[i] * % k; //计算10^n的模
for (int i = ; i <= n; i++)
{
int x = a[i];
while (x)
{
len[i]++;
x /= ;
}
mod[len[i]][++cnt[len[i]]] = a[i] % k;
}
for (int i = ; i <= ; i++)
sort(mod[i] + , mod[i] + cnt[i] + );
ll ans = ;
int mod1, mod2, *l, *r;
for (int i = ; i <= n; i++)
{
for (int j = ; j <= ; j++)
{
mod1 = ((ll)a[i] * mod_10[j]) % k; //谨防int溢出!
mod2 = (k - mod1) % k;
l = lower_bound(mod[j] + , mod[j] + cnt[j] + , mod2);
r = upper_bound(mod[j] + , mod[j] + cnt[j] + , mod2);
ans += (len[i] == j && (mod1 + a[i] % k) % k == )?(r - l - ):(r - l);
//此时状态包含位置对(i,i)且满足条件时减去该方案
}
}
printf("%lld", ans);
return ;
}
AC 代码
cf 1029D的更多相关文章
- Codeforces Round #506 (Div. 3) 1029 D. Concatenated Multiples
题意: 给定n个数字,和一个模数k,从中选出两个数,直接拼接,问拼接成的数字是k的倍数的组合有多少个. 思路: 对于a,b两个数,假定len = length of (b),那么a,b满足条件就是a ...
- ORA-00494: enqueue [CF] held for too long (more than 900 seconds) by 'inst 1, osid 5166'
凌晨收到同事电话,反馈应用程序访问Oracle数据库时报错,当时现场现象确认: 1. 应用程序访问不了数据库,使用SQL Developer测试发现访问不了数据库.报ORA-12570 TNS:pac ...
- cf之路,1,Codeforces Round #345 (Div. 2)
cf之路,1,Codeforces Round #345 (Div. 2) ps:昨天第一次参加cf比赛,比赛之前为了熟悉下cf比赛题目的难度.所以做了round#345连试试水的深浅..... ...
- cf Round 613
A.Peter and Snow Blower(计算几何) 给定一个点和一个多边形,求出这个多边形绕这个点旋转一圈后形成的面积.保证这个点不在多边形内. 画个图能明白 这个图形是一个圆环,那么就是这个 ...
- ARC下OC对象和CF对象之间的桥接(bridge)
在开发iOS应用程序时我们有时会用到Core Foundation对象简称CF,例如Core Graphics.Core Text,并且我们可能需要将CF对象和OC对象进行互相转化,我们知道,ARC环 ...
- [Recommendation System] 推荐系统之协同过滤(CF)算法详解和实现
1 集体智慧和协同过滤 1.1 什么是集体智慧(社会计算)? 集体智慧 (Collective Intelligence) 并不是 Web2.0 时代特有的,只是在 Web2.0 时代,大家在 Web ...
- CF memsql Start[c]UP 2.0 A
CF memsql Start[c]UP 2.0 A A. Golden System time limit per test 1 second memory limit per test 256 m ...
- CF memsql Start[c]UP 2.0 B
CF memsql Start[c]UP 2.0 B B. Distributed Join time limit per test 1 second memory limit per test 25 ...
- CF #376 (Div. 2) C. dfs
1.CF #376 (Div. 2) C. Socks dfs 2.题意:给袜子上色,使n天左右脚袜子都同样颜色. 3.总结:一开始用链表存图,一直TLE test 6 (1)如果需 ...
随机推荐
- Spark 分布式调试工具
0. 说明 编写工具类,考察 Spark 分布式程序的执行地点 1. 工具类编写 [ JMX ] Java Management Extend , Java 管理扩展服务. 主要用于运维和监控. [测 ...
- javascript模块导入导出
第一次知道javascript有模块的概念通常都是使用<script>标签进行引入,不过只能在html文件上使用 增加的模块就如同php里的include.require可以使用引入的内容 ...
- 【Nginx】开启 gzip和缓存
Nginx 开启 gzip和缓存 时间:2016-09-23 16:42:37 nginx 是一个高性能的 Web 服务器,之前也写过一些关于 nginx 的文章.为了提高博客的响应速度,可以从设置 ...
- 转 10 个 Nginx 的安全提示
Nginx是当今最流行的Web服务器之一.它为世界上7%的web流量提供服务而且正在以惊人的速度增长.它是个让人惊奇的服务器,我愿意部署它. 下面是一个常见安全陷阱和解决方案的列表,它可以辅助来确保你 ...
- HTML5API之获取地理位置详解
在使用地理位置API之前先来了解一下什么是经度和纬度以及地理位置获取的原理 首先经度指的是南北极的连接线,纬度指的是东西的连接线 地理位置的获取原理是通过IP地址(基于ISP记录,能够知道这个IP地址 ...
- BZOJ4766:文艺计算姬(矩阵树定理)
Description "奋战三星期,造台计算机".小W响应号召,花了三星期造了台文艺计算姬.文艺计算姬比普通计算机有更多的艺术细胞. 普通计算机能计算一个带标号完全图的生成树个数 ...
- P1231 教辅的组成
传送门:https://www.luogu.org/problemnew/show/P1231 这是一道很不错的网络流入门题,关键在于如何建图. 首先,我们将练习册和源点连一条边权为1的边,然后若书 ...
- 【转】网络安全——一图看懂HTTPS建立过程
阅读目录 准备工作(对应图中prepare1234) 发起链接 最后 关于网络安全加密的介绍可以看之前文章: 1. 网络安全——数据的加密与签名,RSA介绍2. Base64编码.MD5.SHA1-S ...
- Odoo作为App后端时如何调试App
转载请注明原文地址:https://www.cnblogs.com/cnodoo/p/9307340.html 一:Odoo可以作为app后台+后台管理系统使用 Odoo作为一个可供二次开发的框架, ...
- Locust环境搭建及应用-hc课堂笔记
Locust环境搭建: 1,在命令窗口中,进入到python项目路径,如:d:\Pycharmproject\venv\Scripts 2,执行Scripts下的active.bat,进入到虚拟环境 ...