本文主要是介绍第十一届蓝桥杯省赛第一场C++ A组 / B组《整数拼接》(c++),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
1.题目说明
给定一个长度为 n 的数组 A1,A2,⋅⋅⋅,An。
你可以从中选出两个数 Ai 和 Aj(i 不等于 j),然后将 Ai 和 Aj 一前一后拼成一个新的整数。
例如 12 和 345 可以拼成 12345 或 34512。
注意交换 Ai 和 Aj 的顺序总是被视为 2 种拼法,即便是 Ai=Aj 时。
请你计算有多少种拼法满足拼出的整数是 K 的倍数。
2.输入格式
第一行包含 2 个整数 n 和 K。
第二行包含 n 个整数 A1,A2,⋅⋅⋅,An。
3.输出格式
一个整数代表答案。
4.数据范围
1≤n≤10的5次方,
1≤K≤10的5次方,
1≤Ai≤10的9次方
5.输入样例
4 2
1 2 3 4
6.输出样例
6
7.代码
#include <iostream>
#include <cstring>
#include <algorithm>using namespace std;typedef long long LL;
const int N = 100010;int n, m;
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] ++ ;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();res += s[len][(m - t) % m];LL r = t;while (len -- ) r = r * 10 % m;if (r == (m - t) % m) res -- ;}printf("%lld\n", res);return 0;
}
这篇关于第十一届蓝桥杯省赛第一场C++ A组 / B组《整数拼接》(c++)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!