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 解析(思維)的更多相关文章

  1. A. Arena of Greed 解析(思維)

    Codeforce 1425 A. Arena of Greed 解析(思維) 今天我們來看看CF1425A 題目連結 題目 略,請直接看原題. 前言 明明是難度1400的題目,但總感覺不是很好寫阿, ...

  2. E. Almost Regular Bracket Sequence 解析(思維)

    Codeforce 1095 E. Almost Regular Bracket Sequence 解析(思維) 今天我們來看看CF1095E 題目連結 題目 給你一個括號序列,求有幾個字元改括號方向 ...

  3. C2. Power Transmission (Hard Edition) 解析(思維、幾何)

    Codeforce 1163 C2. Power Transmission (Hard Edition) 解析(思維.幾何) 今天我們來看看CF1163C2 題目連結 題目 給一堆點,每兩個點會造成一 ...

  4. F. Moving Points 解析(思維、離散化、BIT、前綴和)

    Codeforce 1311 F. Moving Points 解析(思維.離散化.BIT.前綴和) 今天我們來看看CF1311F 題目連結 題目 略,請直接看原題. 前言 最近寫1900的題目更容易 ...

  5. B. Two Arrays 解析(思維)

    Codeforce 1417 B. Two Arrays 解析(思維) 今天我們來看看CF1417B 題目連結 題目 略,請直接看原題. 前言 a @copyright petjelinux 版權所有 ...

  6. C. k-Amazing Numbers 解析(思維)

    Codeforce 1417 C. k-Amazing Numbers 解析(思維) 今天我們來看看CF1417C 題目連結 題目 略,請直接看原題. 前言 我實作好慢... @copyright p ...

  7. D. Road to Post Office 解析(思維)

    Codeforce 702 D. Road to Post Office 解析(思維) 今天我們來看看CF702D 題目連結 題目 略,請直接看原題. 前言 原本想說會不會也是要列式子解或者二分搜,沒 ...

  8. C. Bank Hacking 解析(思維)

    Codeforce 796 C. Bank Hacking 解析(思維) 今天我們來看看CF796C 題目連結 題目 略,請直接看原題. 前言 @copyright petjelinux 版權所有 觀 ...

  9. B. Kay and Snowflake 解析(思維、DFS、DP、重心)

    Codeforce 685 B. Kay and Snowflake 解析(思維.DFS.DP.重心) 今天我們來看看CF685B 題目連結 題目 給你一棵樹,要求你求出每棵子樹的重心. 前言 完全不 ...

随机推荐

  1. 喜大普奔!GitHub中文版帮助文档上线了!

    日前,GitHub 文档的简体中文正式发布,开发者可以到官方文档上随意查阅浏览中文文档啦!   对于想要玩 GitHub,但一直苦于英语水平较差的程序员来说,这真是一个天大的好消息.下面一起来感受一下 ...

  2. 搭建Linux服务器

    工欲善其事必先利其器, 虚拟机:百度云链接地址:https://pan.baidu.com/s/1_nWQh3WKF7xLs5-nmbZ8lA   (Vmware 12 ) Linux 7:百度云链接 ...

  3. 这么设计,Redis 10亿数据量只需要100MB内存

    本文主要和大家分享一下redis的高级特性:bit位操作. 本文redis试验代码基于如下环境: 操作系统:Mac OS 64位 版本:Redis 5.0.7 64 bit 运行模式:standalo ...

  4. kafka-Reblance

    谁来执行Rebalance以及管理consumer的group呢 coordinator来执行对于consumer group的管理,当consumer group的第一个consumer启动的时候, ...

  5. spring ioc 源码分析之-- beanDefinition的加载过程以及ComponentScan,@componet,@import @Bean等注解解析过程

    背景:我们启动主启动类后,相应的bean就被扫描进来了,原理是啥? 实现该功能的主要核心类就是:ConfigurationClassPostProcessor,我们看看他的继承体系: 它实现了Bean ...

  6. @lookup注解的使用

    背景,如果有一个类C,需要用到类B,如果使用@Autowired注解注入B,那么B每次调用都是同一个对象,即使B不是单例的,现在我希望每次调用B都是不一样的,那么实现方案有2个: 方案A : 每次从容 ...

  7. 008 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 02 Java 中的关键字

    008 01 Android 零基础入门 01 Java基础语法 02 Java常量与变量 02 Java 中的关键字 关键字 关键字就是一些有特殊意义的词 之前学习的程序中涉及到的关键字 Java中 ...

  8. MySql查询语句中的变量使用

    前言 今日在LeetCode刷MySql的题,遇到一题,题目到没什么,解答完了之后习惯去看此题的题解,有位大佬的思路让博主感觉很惊艳,至此,特地记录学习一下. 题目 解答 乍一看题目也没啥,分数排名, ...

  9. Java安全之Commons Collections1分析(二)

    Java安全之Commons Collections1分析(二) 0x00 前言 续上篇文,继续调试cc链.在上篇文章调试的cc链其实并不是一个完整的链.只是使用了几个方法的的互相调用弹出一个计算器. ...

  10. golang Gin framework with websocket

    概述 golang websocket 库 示例 后端 前端 结论 概述 对于 golang 的 web 开发, 之前写过 2 篇 blog, 分别介绍了: 在 Gin 框架下, 各类 http AP ...