专栏文章

题解:CF1029D Concatenated Multiples

CF1029D题解参与者 7已保存评论 9

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
9 条
当前快照
1 份
快照标识符
@mioyottt
此快照首次捕获于
2025/12/03 03:19
3 个月前
此快照最后确认于
2025/12/03 03:19
3 个月前
查看原文
首先拼接后的数字可以表示成:
ai×10d+aja_i\times 10^d+a_j
其中 d=log10aj+1d=\lfloor \log_{10}a_j \rfloor+1
注意到其对 kk 取模后等价于:
(ai×10dmodk)+(ajmodk)(a_i\times 10^d \bmod k)+(a_j\bmod k)
左右两边互不影响,可以对于每一个数字枚举 dd 预处理左边扔进桶里。
然后将每个数字代入右边,算出 dd 后在桶里进行查询即可。
做完了。
CPP
#include<bits/stdc++.h>
#include<bits/extc++.h>
#define int long long
using namespace std;
__gnu_pbds::cc_hash_table<int,int>mp[15];
int a[200005],b[200005],c[200005];
int ans;
signed main(){
    int n,k;
    cin>>n>>k;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        int g=a[i];
        while(g){
            b[i]++;
            g/=10;
        }
        // cout<<b[i]<<' ';
        for(int j=10%k,e=1;e<=10;e++,j=j*10%k){
            mp[e][a[i]%k*j%k]++;
            if(b[i]==e)c[i]=a[i]%k*j%k;
        }
        a[i]%=k;
    }
    for(int i=1;i<=n;i++)
    ans+=mp[b[i]][(k-a[i])%k]-((k-a[i])%k==c[i]);
    cout<<ans;
    return 0;
}

评论

9 条评论,欢迎与作者交流。

正在加载评论...