Codeforces Round #506 (Div. 3)(D

2018-08-25  本文已影响0人  kimoyami

链接:https://codeforces.com/contest/1029/problem/D
思路:题目要求任选两个不相同数按照字符串形式拼起来后,能被k整除,求一共有多少组。首先我们不可能真的把他拼起来再去算,而且n的范围告诉我们我们只能枚举一个数,个数要在O(1)时间内求出,那么我们自然而然想到枚举这个每个数字后面拼1-9位时他的余数,用一个map记录某位数余数位某个数时的数字的个数,然后查询即可。
代码:

#include<bits/stdc++.h>
using namespace std;

int n,k;
const int maxn = 2e5+100;
int a[maxn];
map<int,int> jj[15]; //map<余数,数目> jj[位数]
int num[maxn];
long long res = 0;

int main(){
    scanf("%d%d",&n,&k);
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
        int now = a[i];
        while(now>0){
            now/=10;
            num[i]++;
        }
        jj[num[i]][a[i]%k]++;//位数位num[i]余数位a[i]%k的数个数+1
    }
    for(int i=1;i<=n;i++){
        long long base = 1,now = 0;
        for(int j=1;j<=10;j++){
            base*=10;
            now = ((base%k)*(a[i]%k))%k;
            res+=jj[j][(k-now)%k];//查询位数为j且余数为(k-now)%k的数有多少个
            if(j==num[i]&&(now%k+a[i]%k)%k==0)res--;    //如果对应相等,则他自己也被算了一次,要在这里扣除
        }
    }   
    printf("%I64d\n",res);
    return 0;
}
上一篇下一篇

猜你喜欢

热点阅读