Codeforces | CF1029D 【Concatenated Multiples】
\(qwq\)昨天晚上\(Div.3\)过了这道题...早上交了\(1A\)...看在\(CF\)上\(hack\)的情况并不乐观而且也没人来交这题的份上...我决定发一篇题解帮\((zhuang)\)助\((yi)\)大\((bo)\)家\((x)\)
题目大意:给出\(n\)个数\(a_1,a_2,\dots,a_n\)和\(k\),求对于任意的两个数\(a_i,a_j(i\neq j)\),使得两数连接起来组成的新数(如\(12\)与\(3456\)连接组成\(123456\))是\(k\)的倍数的选定方式共有多少种.
很显然检验所有的组合并不现实,一共有\(n\times (n-1)\)个新数组成方法(n方乱搞绝对T飞),所以显然需要用一些特\((qi)\)殊\((ji)\)方\((yin)\)法\((qiao)\)来搞定这道题.
利用这是一道数论题的性质,显然涉及到整除可以从余数的角度考虑(这还用想吗),考虑到题目上拼接的操作对余数的影响,我们可以对所有的\(a_1,a_2,\dots,a_n\)进行预处理,只需要找到合适的\(i,j(i\neq j)\)使得\(a_i\times (\lfloor log_{10}a_j\rfloor+1)+a_j=0(mod\ k)\)即可.
所以只需找出能与\(a_i\)组成\(k\)的倍数的\(a_j\)个数并累加即可,个数由预处理得到.
预处理在本题中显得尤为重要,对于每一个数\(a_i\)都可以前接\(a_j\),由于连接操作对前数的余数影响取决于后数的位数,故我们需要判断\(a_i\)的位数下对应能与\(a_i\)余数加和成为\(k\)的倍数的数的个数,所以预处理的内容就是后接\(m(m\in [1,10])\)位数后各余数对应数字的个数(表达能力掉线...感性理解一下)
梳理一下思路:先对所有的\(a_1,a_2,\dots,a_n\),处理每个数后接\(m(m\in [1,10])\)位数后的余数情况(在此选用\(map\)存储...毕竟余数值域是\([0,10^9-1]\)...处理对应\(map\)中后接\(m\)位时的余数作为下标的值\(+1\)即可统计个数),同时考虑到这样做有可能把\(a_i\)后接\(a_i\)的情况记入答案,所以在累加后特判一下\(a_i\)后接\(a_i\)的情况是否合法,合法时将\(ans--\)去重.
下面放代码\(\downarrow \downarrow \downarrow\)...如果实在理解不了的话...我也没什么办法惹(逃)
#include<cstdio>//CF1029D
#include<iostream>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#include<map>
using namespace std;
map<int,int>mp[11];
const int N=2e5+5;
const long long shi[11]={1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000,10000000000};
int ws(int u){
return (int)log10(u)+1;
}
int n,k,a[N],mo[N];
long long ans;
int main(){
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
mo[i]=a[i]%k;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=10;j++){
mp[j][(int)(((shi[j]%k)*mo[i])%k)]++;
}
}
for(int i=1;i<=n;i++){
int w=ws(a[i]);
ans+=mp[w][(k-mo[i])%k];
if((int)((((shi[w]%k)*mo[i])%k)+mo[i])%k==0){
ans--;
}
}
printf("%lld\n",ans);
return 0;
}
小小卡了一下常数刚好跑过\(qwq\)...生死速度就差\(35ms\)(逃)
\(update1:(20180828)\)
由于本题毒瘤卡常卡的厉害...上面代码还是有可能会T(都怪CF评测机...脸黑就是过不了(逃))...所以再放一个卡了常数的代码...亲测\(1887ms\)跑过...应该算是比较保险了...
#include<cstdio>//CF1029D
#include<iostream>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
#include<cstdlib>
#include<map>
using namespace std;
map<int,int>mp[11];
const int N=2e5+5;
int ws(int u){
return (int)log10(u)+1;
}
int n,k,a[N],mo[11][N];
long long ans;
int main(){
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
mo[0][i]=a[i]%k;
for(int j=1;j<=10;j++){
mo[j][i]=(int)(((long long)mo[j-1][i]*10)%k);
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=10;j++){
if(mo[j][i]){
mp[j][mo[j][i]]++;
}
else{
mp[j][0]++;
}
}
}
for(int i=1;i<=n;i++){
int w=ws(a[i]);
if(mo[0][i]){
ans+=mp[w][k-mo[0][i]];
}
else{
ans+=mp[w][0];
}
if((mo[w][i]+mo[0][i])%k==0){
ans--;
}
}
printf("%lld\n",ans);
return 0;
}
Codeforces | CF1029D 【Concatenated Multiples】的更多相关文章
- Codeforces 176B【计数DP】
题意: 给你两个串s1,s2和一个K, 有一种操作是在一个串切开然后交换位置, 问s1有多少种方法经过K次这样的操作变成s2: 思路: (从来没接触过计数DP...还是太菜...参考了[大牛blog] ...
- CodeForces 604D 【离散数学 置换群】
题意: 给你一个方程,方程太变态不打,给你一个p一个k,p保证是大于等于3的质数,k保证在0~p-1之间的整数.要求对应函数的定义域在0~p-1值域为0~p-1的子集,求这样的函数有多少个... 分析 ...
- CodeForces 602D 【单调队列】【简单数学】
题意: 给你n个数,m次询问,每次询问给l和r代表l和r中间所有子区间中特征值的和. 特征值的定义是在这个区间中找i和j使得|tmp[i]-tmp[j]|/|j-i|最大. 思路: 首先是特征值的定义 ...
- CodeForces 617C【序枚举】
题意: 有两个点喷水,有很多个点有花,给出坐标. 求使得每个花都可以被喷到,两个喷水的半径的平方的和最小是多少. 思路: 枚举其中一个喷水的最大半径. 坑: 这题我贪心的思路有很大问题.一开始也是想这 ...
- CodeForces 602E【概率DP】【树状数组优化】
题意:有n个人进行m次比赛,每次比赛有一个排名,最后的排名是把所有排名都加起来然后找到比自己的分数绝对小的人数加一就是最终排名. 给了其中一个人的所有比赛的名次.求这个人最终排名的期望. 思路: 渣渣 ...
- Codeforces | CF1029F 【Multicolored Markers】
这道题其实难度应该小于紫题...除了一点小特判以外没什么难度...\(\leq50\)行代码即可\(AC\)此题 题目大意:给定两个数\(a,b(1\leq a,b\leq 10^{14})\)分别表 ...
- Codeforces | CF1037D 【Valid BFS?】
题目大意:给定一个\(n(1\leq n\leq 2\cdot10^5)\)个节点的树的\(n-1\)条边和这棵树的一个\(BFS\)序\(a_1,a_2,\dots,a_n\),判断这个\(BFS\ ...
- Codeforces | CF1029C 【Maximal Intersection】
论Div3出这样巨水的送分题竟然还没多少人AC(虽说当时我也没A...其实我A了D...逃) 这个题其实一点都不麻烦,排序都可以免掉(如果用\(priority \_ queue\)的话) 先考虑不删 ...
- codeforces 217E 【Alien DNA】
倒序考虑每一个操作,对于一个操作$[l, r]$,他产生的影响区间将是$[r+1,r + r + l - 1]$,如果$r+l-1>K$的话,$K$之后的区间我们是不关心的. 暴力扫描这个区间 ...
随机推荐
- pycharm设置pytest运行程序
- JavaScript动态修改html组件form的action属性
用javaScript动态修改html组件form的action属性,可以在提交时再决定处理表单的页面. <%--JavaScript部分--%><script language=& ...
- Servlet 快速概览
目录 生命周期 web.xml 获取表单数据(设置请求的编码格式) 返回响应内容(设置响应的编码格式) 结合前两点,总结基本模板 获取请求协议头部信息 设置响应头部信息 使用过滤器 在web.xml中 ...
- PHP优化与提升
一.十个不错的建议 1.使用 ip2long() 和 long2ip() 函数来把 IP 地址转化成整型存储到数据库里.这种方法把存储空间降到了接近四分之一(char(15) 的 15 个字节对整形的 ...
- MySQL 性能调优之存储引擎
原文:http://bbs.landingbj.com/t-0-246222-1.html http://bbs.landingbj.com/t-0-245851-1.html MySQ ...
- C#封装SQLite数据库
网上有许多介绍关于SQLite数据库的,这里我就不多说了,这里主要介绍SQLite数据库在C#中的应用,它的应用主要依赖于System.Data.SQLite.dll文件,可以点击这里下载https: ...
- java8新特性:interface中的static方法和default方法
java8中接口有两个新特性,一个是静态方法,一个是默认方法. static方法 java8中为接口新增了一项功能:定义一个或者多个静态方法. 定义用法和普通的static方法一样: public i ...
- java随笔4 java中接参整形转字符串
通过+‘’来实现
- 源码追踪,解决Could not locate executable null\bin\winutils.exe in the Hadoop binaries.问题
在windows系统本地运行spark的wordcount程序,会出现一个异常,但不影响现有程序运行. >>提君博客原创 http://www.cnblogs.com/tijun/ & ...
- idea中 maven打包时时报错User setting file does not exist C:\Users\lenevo\.m2\setting.xml,
第一种错误 :idea中 maven打包时时报错User setting file does not exist C:\Users\lenevo\.m2\setting.xml, 解决方案如下:将ma ...