P8712 [蓝桥杯 2020 省 B1] 整数拼接 :
对于大整数取模
接着,先给出取模的几个重要结论:
-
(a + b) % p = (a%p + b%p) %p
-
(a - b) % p = ((a%p - b%p) + p) %p
-
(a * b) % p = ((a%p)*(b%p) %p
对于最后一条性质,即多个因子连续的乘积取模的结果等于每个因子取模后的乘积再取
模的结果
#include<iostream>
using namespace std;
const int N = 100010;
long arr[N] = {0};
int s[11][N] = {0}; // 使用数组代替哈希表
int main(){
int n, k;
cin >> n >> k;
// 计算10的幂对k取模的结果
for(int i = 0; i < n; i++){
cin >> arr[i];
long t = arr[i] % k;
for (int j = 0; j < 11; j++){
s[j][t]++;
t = t * 10 % k;
}
}
long count = 0;
for(int i = 0; i < n; i++){
long t = arr[i] % k;
int len = to_string(arr[i]).size();
count += s[len][(k - t) % k];
// 检查自匹配的情况
long r = t;
for (int j = 0; j < len; j++) r = r * 10 % k;
if (r == (k - t) % k) count--;
}
cout << count;
return 0;
}