题面

题目描述

给定含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的更多相关文章

  1. Codeforces Round #506 (Div. 3) 1029 D. Concatenated Multiples

    题意: 给定n个数字,和一个模数k,从中选出两个数,直接拼接,问拼接成的数字是k的倍数的组合有多少个. 思路: 对于a,b两个数,假定len = length of (b),那么a,b满足条件就是a ...

  2. 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 ...

  3. cf之路,1,Codeforces Round #345 (Div. 2)

     cf之路,1,Codeforces Round #345 (Div. 2) ps:昨天第一次参加cf比赛,比赛之前为了熟悉下cf比赛题目的难度.所以做了round#345连试试水的深浅.....   ...

  4. cf Round 613

    A.Peter and Snow Blower(计算几何) 给定一个点和一个多边形,求出这个多边形绕这个点旋转一圈后形成的面积.保证这个点不在多边形内. 画个图能明白 这个图形是一个圆环,那么就是这个 ...

  5. ARC下OC对象和CF对象之间的桥接(bridge)

    在开发iOS应用程序时我们有时会用到Core Foundation对象简称CF,例如Core Graphics.Core Text,并且我们可能需要将CF对象和OC对象进行互相转化,我们知道,ARC环 ...

  6. [Recommendation System] 推荐系统之协同过滤(CF)算法详解和实现

    1 集体智慧和协同过滤 1.1 什么是集体智慧(社会计算)? 集体智慧 (Collective Intelligence) 并不是 Web2.0 时代特有的,只是在 Web2.0 时代,大家在 Web ...

  7. 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 ...

  8. 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 ...

  9. CF #376 (Div. 2) C. dfs

    1.CF #376 (Div. 2)    C. Socks       dfs 2.题意:给袜子上色,使n天左右脚袜子都同样颜色. 3.总结:一开始用链表存图,一直TLE test 6 (1)如果需 ...

随机推荐

  1. Difference between HashMap and Hashtable | HashMap Vs Hashtable

    Both the HashMap and Hashtable implement the interface java.util.Map but there are some slight diffe ...

  2. Python学习--Selenium模块简单介绍(1)

    简介及运行流程 Selenium 是一个用于Web应用程序测试的工具.Selenium测试直接运行在浏览器中,就像真正的用户在操作一样.支持的浏览器包括IE(7, 8, 9, 10, 11),Mozi ...

  3. python ddt模块

    ddt模块包含了一个类的装饰器ddt和两个方法的装饰器: data:包含多个你想要传给测试用例的参数: file_data:会从json或yaml中加载数据: 通常data中包含的每一个值都会作为一个 ...

  4. 2017 SDN第一次作业

    (1)我会选择的,因为网络现在越来越重要,各行各业都离不开网络,这个方向可以适合各种岗位,感觉比较容易就业.但选这个课是为了多学一点东西,没想太多,嘎嘎嘎. (2)SDNLAB,是一个SDN的大的中文 ...

  5. android 实现mqtt消息推送,以及不停断线重连的问题解决

    前段时间项目用到mqtt的消息推送,整理一下代码,代码的原型是网上找的,具体哪个地址已经忘记了. 代码的实现是新建了一个MyMqttService,全部功能都在里面实现,包括连服务器,断线重连,订阅消 ...

  6. Maven单独构建多模块项目中的单个模块

    Maven单独构建多模块项目中的单个模块   说明: 1.可能存在的场景,多模块项目没有互相引用,那么此时可以单独构建单个项目,指定到子模块的pom.xml文件即可完成编译. 2.如果多模块项目各自都 ...

  7. tomcat:8080/返回404;/etc/hosts(identifier-Namespace-scope)

    我以为 就oracle 的 oracle db ,weblogic喜欢和 hostname 死磕: 没想到开源的tomcat也是如出一辙,名不正则言不顺,为什么,“名”的力量这么大呢?命名空间. 有个 ...

  8. centos 7 安装jira 破解

    http://blog.csdn.net/itjinglun/article/details/52240479

  9. PAT B1010 一元多项式求导 (25 分)

    设计函数求一元多项式的导数.(注:x​n​​(n为整数)的一阶导数为nx​n−1​​.) 输入格式: 以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过 1000 的整数).数字间以空格分隔. ...

  10. python利用imap实现伪“无痕”取信

    所谓无痕取信,目前主要是指从邮箱中把信件收取后,邮箱内状态不发生任何改变.这里的状态主要是指两部分,一部分是邮件状态不变,即已读与未读状态不变,另一部分是指邮箱记录的登陆IP不发生改变.本文中所说的伪 ...