题目描述
给定一个长度为 n 的数组 A1,A2,⋅⋅⋅,An。
你可以从中选出两个数 Ai和 Aj(i 不等于 j),然后将 Ai 和 Aj
一前一后拼成一个新的整数。
例如 12
和 345 可以拼成 12345 或 34512。
注意交换 Ai和 Aj 的顺序总是被视为 2 种拼法,即便是 Ai=Aj时。
请你计算有多少种拼法满足拼出的整数是 K的倍数。
输入格式
第一行包含 2个整数 n 和 K。
第二行包含 n个整数 A1,A2,⋅⋅⋅,An。
输出格式
一个整数代表答案。
数据范围
1≤n≤1e5,
1≤K≤1e5,
1≤Ai≤1e9
样例
输入样例:
4 2
1 2 3 4
输出样例:
6
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
using namespace std;
int n,k;
int a[100005];
typedef long long ll;
ll s[11][100005];
int main(int argc, char** argv) {
scanf("%d%d",&n,&k);
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
for(int i=0;i<n;i++){
ll t=a[i]%k;
for(int j=0;j<11;j++){
s[j][t]++;//低位那个数有几位数
t=t*10%k;
}
}
ll res=0;
for(int i=0;i<n;i++){
ll t=a[i]%k;
int len=to_string(a[i]).size();
res+=s[len][(k-t)%k];
//去重
ll r=t;
while(len--){
r=r*10%k;
}
if(r==(k-t)%k) res--;
}
cout<<res<<endl;
return 0;
}
来源: B1ackGod ,
Frontier ,