Description
给定义个长度为 n 的数组 A1, A2, · · · , An。你可以从中选出两个数 Ai 和Aj(i 不等于 j),然后将 Ai 和 Aj 一前一后拼成一个新的整数。例如 12 和 345 以拼成 12345 或 34512。注意交换 Ai 和 Aj 的顺序总是被视为 2 种拼法,即便是 Ai = Aj 时。
请你计算有多少种拼法满足拼出的整数是 K 的倍数。
Input
第一行包含 2 个整数 n 和 K。
第二行包含 n 个整数 A1, A2, · · · , An。
Output
一个整数代表答案。
Sample Input
4 2
1 2 3 4
Sample Output
6
More Info
对于 30% 的评测用例,1 ≤ n ≤ 1000, 1 ≤ K ≤ 20, 1 ≤ Ai ≤ 10^4。
对于所有评测用例,1 ≤ n ≤ 10^5,1 ≤ K ≤ 10^5,1 ≤ Ai ≤ 10^9。
方案
- 考虑到 string 型变量支持拼接相加,较为方便,数据先存为 string 型。
string s1 = "123";
string s2 = "456";
string s3 = s1 + s2; //拼接
cout << s3; //则 s3 = "123456"
- string 转换为 long long (Ai 的范围是 1e9 拼接后要用到 long long )。
ll tra(string x) { //字符串转整
ll num=0;
ll n=1;
for (int i = x.length()-1; i >=0 ; i--) {
num += (x[i] - '0') * n;
n *= 10;
}
return num;
}
3.完整代码。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
string s[100005];
ll n,k;
ll tra(string x) { //字符串转整
ll num=0;
ll n=1;
for (int i = x.length()-1; i >=0 ; i--) {
num += (x[i] - '0') * n;
n *= 10;
}
return num;
}
int main()
{
ll cnt = 0;
cin >> n >> k;
for (int i = 1; i <= n; i++) {
cin >> s[i];
}
for (int i = 1; i < n; i++)
for (int j = i+1; j <= n; j++) { //枚举组合数,保证抽取的单一性
string temp1 = s[i] + s[j]; //两数一前一后两种组合方式
string temp2 = s[j] + s[i];
ll t1 = tra(temp1);
ll t2 = tra(temp2);
if (t1 % k == 0) cnt++;
if (t2 % k == 0) cnt++;
}
cout << cnt;
return 0;
}