算法1
思路:创造11个哈希表存,感觉还得来几遍,理解不是很清楚
C++ 代码
#include<iostream>
#include<cstdio>
using namespace std;
int n,m;
typedef long long LL;
const int N=10010;
int a[N],s[11][N];
int main(){
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)scanf("%d",&a[i]);
for(int i=0;i<n;i++){//处理哈希表
LL t=a[i]%m;//得到每个数的余数是多少
for(int j=0;j<11;j++){//统计每个余数是多少
s[j][t]++;//第j个哈希表上的余数t是多少
t=t*10%m;
}
}
LL res=0;
for(int i=0;i<n;i++){ //处理输出
LL t=a[i]%m;
int len=to_string(a[i]).size();//加之前需要看a的位数是多少
res+=s[len][(m-t)%m];//这里的相当于ki
LL r=t;
while(len--) r=r*10%m;
if(r==(m-t)%m) res--;
}
printf("%lld\n",res);
return 0;
}
算法2
(暴力枚举) $O(n^2)$
blablabla
时间复杂度
参考文献
C++ 代码
blablabla