\(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】的更多相关文章

  1. Codeforces 176B【计数DP】

    题意: 给你两个串s1,s2和一个K, 有一种操作是在一个串切开然后交换位置, 问s1有多少种方法经过K次这样的操作变成s2: 思路: (从来没接触过计数DP...还是太菜...参考了[大牛blog] ...

  2. CodeForces 604D 【离散数学 置换群】

    题意: 给你一个方程,方程太变态不打,给你一个p一个k,p保证是大于等于3的质数,k保证在0~p-1之间的整数.要求对应函数的定义域在0~p-1值域为0~p-1的子集,求这样的函数有多少个... 分析 ...

  3. CodeForces 602D 【单调队列】【简单数学】

    题意: 给你n个数,m次询问,每次询问给l和r代表l和r中间所有子区间中特征值的和. 特征值的定义是在这个区间中找i和j使得|tmp[i]-tmp[j]|/|j-i|最大. 思路: 首先是特征值的定义 ...

  4. CodeForces 617C【序枚举】

    题意: 有两个点喷水,有很多个点有花,给出坐标. 求使得每个花都可以被喷到,两个喷水的半径的平方的和最小是多少. 思路: 枚举其中一个喷水的最大半径. 坑: 这题我贪心的思路有很大问题.一开始也是想这 ...

  5. CodeForces 602E【概率DP】【树状数组优化】

    题意:有n个人进行m次比赛,每次比赛有一个排名,最后的排名是把所有排名都加起来然后找到比自己的分数绝对小的人数加一就是最终排名. 给了其中一个人的所有比赛的名次.求这个人最终排名的期望. 思路: 渣渣 ...

  6. Codeforces | CF1029F 【Multicolored Markers】

    这道题其实难度应该小于紫题...除了一点小特判以外没什么难度...\(\leq50\)行代码即可\(AC\)此题 题目大意:给定两个数\(a,b(1\leq a,b\leq 10^{14})\)分别表 ...

  7. Codeforces | CF1037D 【Valid BFS?】

    题目大意:给定一个\(n(1\leq n\leq 2\cdot10^5)\)个节点的树的\(n-1\)条边和这棵树的一个\(BFS\)序\(a_1,a_2,\dots,a_n\),判断这个\(BFS\ ...

  8. Codeforces | CF1029C 【Maximal Intersection】

    论Div3出这样巨水的送分题竟然还没多少人AC(虽说当时我也没A...其实我A了D...逃) 这个题其实一点都不麻烦,排序都可以免掉(如果用\(priority \_ queue\)的话) 先考虑不删 ...

  9. codeforces 217E 【Alien DNA】

    倒序考虑每一个操作,对于一个操作$[l, r]$,他产生的影响区间将是$[r+1,r + r + l - 1]$,如果$r+l-1>K$的话,$K$之后的区间我们是不关心的. 暴力扫描这个区间 ...

随机推荐

  1. Django的contenttypes

    这是一个django内置的表结构,为的就是通过两个字段让表和N张表创建FK关系. 比如说有两种不同课程,这两种课程都有价格周期和策略.如果最低级的则是给每个表创建一个价格策略.如果非要在同一个表内使用 ...

  2. Composer安装与使用

    Composer是PHP中用来管理依赖(dependency)关系的工具.你可以在自己的项目中声明所依赖的外部工具库(libraries),Composer会帮你安装这些依赖的库文件. Windows ...

  3. python--logging日志

    一个非常详细的日志使用请看这里:http://www.cnblogs.com/dkblog/archive/2011/08/26/2155018.html # 导入日志模块 import loggin ...

  4. java8新特性:interface中的static方法和default方法

    java8中接口有两个新特性,一个是静态方法,一个是默认方法. static方法 java8中为接口新增了一项功能:定义一个或者多个静态方法. 定义用法和普通的static方法一样: public i ...

  5. [转帖]Huge Page 是否是拯救性能的万能良药?

    Huge Page 是否是拯救性能的万能良药? 本文将分析是否Huge Page在任何条件下(特别是NUMA架构下)都能带来性能提升. 文章欢迎转载,但转载时请保留本段文字,并置于文章的顶部 作者:卢 ...

  6. 转:win7下git凭据导致无法clone代码

    win7下存在一个凭据管理的情况,如果旧凭据没有删除,用新账户是无法clone代码的. https://blog.csdn.net/qq_34665539/article/details/804082 ...

  7. python爬虫之git的团队协作

    一.Git实践: commit,push,pull,status,add基本是最常用的几个命令. 1.首先我在github上创建了一个项目,然后我在本地的文件建立了一个普通的目录(git_data). ...

  8. 21.PHP实现Word/Excel/PPT转换为PDF

    参考文档: https://www.cnblogs.com/woider/p/7003481.html http://blog.csdn.net/aoshilang2249/article/detai ...

  9. 解决mybatis generator警告Cannot obtain primary key information from the database, generated objects may be incomplete

    使用 mybatis generator 生成pojo.dao.mapper时 经常出现 Cannot obtain primary key information from the database ...

  10. INotifyPropertyChanged

    在WPF MVVM模式开发中,实现INotifyPropertyChanged的ViewModel是非常重要且常见的类: public class MainViewModel : INotifyPro ...