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)如果需 ...
随机推荐
- Online, Cheap -- and Elite
Online, Cheap -- and Elite Analysis of Georgia Tech’s MOOC-inspired online master's in computer scie ...
- 64位Windows的Dos中取消了edit命令
前段时间在玩dos命令行的时候,用copy con创建了txt文件后想对其进行编辑,然后我又不想用记事本,所以去网上找命令行中对文本文件进行编辑的命令(纯属想装B),结果看到了edit命令. 一敲,就 ...
- 乘风破浪:LeetCode真题_032_Longest Valid Parentheses
乘风破浪:LeetCode真题_032_Longest Valid Parentheses 一.前言 这也是非常有意思的一个题目,我们之前已经遇到过两个这种括号的题目了,基本上都要用到堆栈来解决,这次 ...
- div中嵌套div水平居中,垂直居中
方法一: div(父):display:table; div(子):display:table_cell;margin:0 auto;vertical-align:middle; 方法二: div(父 ...
- October 22nd, 2017 Week 43rd Sunday
Yesterday is not ours to recover, but tomorrwo is ours to win or lose. 我们无法重拾昨天,但我们可以选择赢得或者输掉明天. Eve ...
- T4学习- 3、创建运行时模板
使用 Visual Studio 预处理过的文本模板,可以在运行时在应用程序中生成文本字符串. 执行应用程序的计算机不必具有 Visual Studio. 预处理过的模板有时称为"运行时文本 ...
- XtraEditors四、TextEdit、ButtonEdit、PictureEdit、RadioGroup、PopupContainerEdit
TextEdit控件 以文本框的形式绑定各种形式的选择框: 文本框设置 输入 密码 字符 时, 要有 * 号掩盖输入的字符, 代码如下: textEdit1.Properties.PasswordCh ...
- Android 生态消息推送平台介绍
一.手机厂商平台 华为消息推送服务 华为推送(Push)是为开发者提供的消息推送平台,建立了从云端到手机端的消息推送通道,使应用可以将最新信息及时通知用户,从而构筑良好的用户关系,提升用户的感知和活跃 ...
- ACM模拟赛
今天是毕业的学长给高二的同学测试.组队比赛,ACM赛制,于是就愉快的和学姐一队啦. 看到英文题面感到恐慌,不过好在不难读懂. A:并没有什么技术含量的模拟题: B:字符串题,给定一些比赛和每个队胜利的 ...
- Python中让MySQL查询结果返回字典类型的方法
import pymysql host='localhost' user='root' passwd='root' port=3306 db='test' db=pymysql.connect( ho ...