整数拼接
哈希表+枚举
#include<cstring>
#include<iostream>
#define N 100010
typedef long long LL;
int n,k;
int a[N],s[11][N];
int main()
{
scanf("%d%d",&n,&k);
for(int i = 0;i < n;i ++) scanf("%d",&a[i]);
//Aj*10^i(mod k) 预处理恒等式=>左边
for(int j = 0;j < n;j ++)
{
LL t = a[j] % k;
for(int i = 0;i < 11;i ++)
{
s[i][t] ++; //把等式左边所有存在的情况标记
t = t * 10 % k;
}
}
LL res = 0;
//-Ai (mod k) 预处理恒等式=>右边
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];
//判断Aj != Ai
LL r = t;
while(len --) r = r * 10 % k;
if(r == (k - t) % k) res --;
}
}
大佬 预处理左边的时候为什么j要从0开始啊 长度又不会为0
确实用不到长度是0的,这么写是为了循环的时候保持等式成立,不想从0开始枚举反一下就好了