D. Concatenated Multiples 解析(思維)
Codeforce 1029 D. Concatenated Multiples 解析(思維)
今天我們來看看CF1029D
題目連結
題目
給你一個序列\(a\)和一個數字\(k\),求有幾種indices pair可以讓兩個數字串接在一起之後可以被\(k\)整除。
前言
set,map這些東西的常數真的有夠高阿

想法
\(a_i\)和\(a_j\)串接起來是\(a_i\times 10^{digit(a_j)}+a_j\),我們固定一個\(a_i\)和\(digit(???)\),要看看哪些\(a_j\)符合長度是\(digit(???)\)和串接起來可被整除。
實作細節:我們可以先把相同長度的\(a_j\)放到一個\(vector\)裡,並且接著\(a_j\%=k\)。
如此一來決定了\(a_i\times 10^{digit(???)}\mod k\)是多少以後,只需要找到在同樣長度的\(a_j\)中,哪些剛好\(=(k-(a_i\times 10^{digit(???)}\mod k))\mod k\),而又因為我們已經把\(a_j\%=k\)過了,所以可以在\(sort\)過同樣長度的\(a_j\)後,直接\(upperbound-lowerbound\)找同樣值的元素有多少個。
還有,\(digit(a_j)\)的其中一種求法是\(digit(a_j)=1+log10(a_j)\)
其實我一開始是用\(map\)實作的,想法是固定\(a_j\)然後看看\(map\)裡又多少個\(a_i\times 10^{digit(???)}\)剛好可以符合要求,然後從前往後+從後往前各看一次。然而這題的\(k\le1e9\),因此\(map\)非常可能需要\(insert\)非常多空白元素,造成TLE,其中一部分造成TLE的原因是因為\(insert\)時要\(allocate\)新記憶體位置,這樣造成非常大的常數。
程式碼(正常作法):
const int _n=2e5+10;
int t,n,k,a[_n],dig[_n],ten[11];
VI d2a[_n];
ll ans;
main(void) {ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n>>k;rep(i,0,n)cin>>a[i];ten[0]=1;rep(i,1,11)ten[i]=1ll*ten[i-1]*10%k;
rep(i,0,n)dig[i]=1+log10(a[i]),a[i]%=k,d2a[dig[i]].pb(a[i]);
rep(i,1,11)sort(all(d2a[i]));
rep(i,0,n)rep(j,1,11){
t=k-1ll*a[i]*ten[j]%k;if(t==k)t=0;
ans+=upper_bound(all(d2a[j]),t)-lower_bound(all(d2a[j]),t);
if(dig[i]==j and a[i]==t)ans--;
}cout<<ans<<'\n';
return 0;
}
標頭、模板請點Submission看
Submission
程式碼(改成unordered_map以後1800ms的AC):
const int _n=2e5+10;
int t,n,k,a[_n];
ll ans;
ll ten[11]={1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000,10000000000ll};
struct pair_hash
{
template <class T1, class T2>
std::size_t operator() (const std::pair<T1, T2> &pair) const
{
return std::hash<T1>()(pair.first) ^ std::hash<T2>()(pair.second);
}
};
unordered_map<PII,int,pair_hash> mp;
main(void) {ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
cin>>n>>k;rep(i,0,n)cin>>a[i];
rep(i,0,n){
ans+=mp[{(k-a[i]%k)%k,1+log10(a[i])}];
rep(j,1,11)mp[{(1ull*a[i]*ten[j])%(1ull*k),j}]++;
}mp.clear();
per(i,0,n){
ans+=mp[{(k-a[i]%k)%k,1+log10(a[i])}];
rep(j,1,11)mp[{(1ull*a[i]*ten[j])%(1ull*k),j}]++;
}cout<<ans<<'\n';
return 0;
}
標頭、模板請點Submission看
Submission
D. Concatenated Multiples 解析(思維)的更多相关文章
- A. Arena of Greed 解析(思維)
Codeforce 1425 A. Arena of Greed 解析(思維) 今天我們來看看CF1425A 題目連結 題目 略,請直接看原題. 前言 明明是難度1400的題目,但總感覺不是很好寫阿, ...
- E. Almost Regular Bracket Sequence 解析(思維)
Codeforce 1095 E. Almost Regular Bracket Sequence 解析(思維) 今天我們來看看CF1095E 題目連結 題目 給你一個括號序列,求有幾個字元改括號方向 ...
- C2. Power Transmission (Hard Edition) 解析(思維、幾何)
Codeforce 1163 C2. Power Transmission (Hard Edition) 解析(思維.幾何) 今天我們來看看CF1163C2 題目連結 題目 給一堆點,每兩個點會造成一 ...
- F. Moving Points 解析(思維、離散化、BIT、前綴和)
Codeforce 1311 F. Moving Points 解析(思維.離散化.BIT.前綴和) 今天我們來看看CF1311F 題目連結 題目 略,請直接看原題. 前言 最近寫1900的題目更容易 ...
- B. Two Arrays 解析(思維)
Codeforce 1417 B. Two Arrays 解析(思維) 今天我們來看看CF1417B 題目連結 題目 略,請直接看原題. 前言 a @copyright petjelinux 版權所有 ...
- C. k-Amazing Numbers 解析(思維)
Codeforce 1417 C. k-Amazing Numbers 解析(思維) 今天我們來看看CF1417C 題目連結 題目 略,請直接看原題. 前言 我實作好慢... @copyright p ...
- D. Road to Post Office 解析(思維)
Codeforce 702 D. Road to Post Office 解析(思維) 今天我們來看看CF702D 題目連結 題目 略,請直接看原題. 前言 原本想說會不會也是要列式子解或者二分搜,沒 ...
- C. Bank Hacking 解析(思維)
Codeforce 796 C. Bank Hacking 解析(思維) 今天我們來看看CF796C 題目連結 題目 略,請直接看原題. 前言 @copyright petjelinux 版權所有 觀 ...
- B. Kay and Snowflake 解析(思維、DFS、DP、重心)
Codeforce 685 B. Kay and Snowflake 解析(思維.DFS.DP.重心) 今天我們來看看CF685B 題目連結 題目 給你一棵樹,要求你求出每棵子樹的重心. 前言 完全不 ...
随机推荐
- synchronized和lock的作用与对比
一.synchronized的作用 synchronized是java中的一个关键字,用于线程同步.1. 修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象 ...
- CCNP:重发布及实验
重发布(又:重分布.重分发):一台设备同时运行于两个协议或两个进程,默认从两端学习到的路由条目不共享:重发布技术就是人为的进行共享. 一 满足: 1.必须存在ASBR --- 自治系统边界路由器-- ...
- 超详细的 Vagrant 上手指南
搭建 Linux 虚拟机,别再用 VirtualBox 从 .iso 文件安装了. 概述 2020 年了,也许你已经习惯了 docker,习惯了在 XX 云上快速创建云主机,但是如果你想在个人电脑上安 ...
- Maven依赖管理之BOM
目录 什么是BOM 一个BOM的格式 怎么使用BOM 通过parent引用 通过dependencyManagement引用 怎么查看依赖的某个BOM的具体清单 版本冲突时的一些规则 何为依赖调节 参 ...
- Centos-文本过滤-grep
grep 文本过滤,对文本的每一行进行关键字搜索,如果找到则输出 相关选项 -A 除了列出符合关键字的行外,还输出符合关键字行后多少行内容 -c 只显示符号条件的行号 -f 批量搜索,把关键字写入到 ...
- 玩命学JVM(二)—类加载机制
前言 Java程序运行图: 上一篇玩命学JVM(一)-认识JVM和字节码文件我们简单认识了 JVM 和字节码文件.那JVM是如何使用字节码文件的呢?从上图清晰地可以看到,JVM 通过类加载器完成了这一 ...
- 图文并茂C++精华总结 复习和进阶
字面常量不可以有引用,因为这也不需要使用符号来引用了,但是字面常量却可以初始化const引用,这将生成一个只读变量: 对变量的const修饰的引用是只读属性的: 也就是说,const修饰的引用,不管是 ...
- P3545 [POI2012]HUR-Warehouse Store
题目描述 n天.第i天上午会进货Ai件商品,中午的时候会有顾客需要购买Bi件商品,可以选择满足顾客的要求,或是无视掉他. 如果要满足顾客的需求,就必须要有足够的库存.问最多能够满足多少个顾客的需求. ...
- 使用HTML的基本结构创建网页
1. 网页的扩展名--html或htm 2. 如何新建网页? 步骤1: 在电脑的空白处,右键选择-->新建--文本文档 步骤2: 把txt的扩展名,改成html或htm, ...
- java高级项目 jdbc与数据库连接数据库
//图书管类 public class Book { private Integer id; private String b_name; private double b_price; privat ...