整数拼接
问题描述
给定义个长度为 n 的数组 A1, A2, · · · , An。你可以从中选出两个数 Ai 和 Aj (i 不等于 j),然后将 Ai 和 Aj 一前一后拼成一个新的整数。例如 12 和 345 可以拼成 12345 或 34512。注意交换 Ai 和 Aj 的顺序总是被视为 2 种拼法,即便是 Ai = Aj 时。请你计算有多少种拼法满足拼出的整数是 K 的倍数。
输入格式
第一行包含 2 个整数 n 和 K。
第二行包含 n 个整数 A1, A2, · · · , An。
输出格式
一个整数代表答案。
样例输入
4 2
1 2 3 4
样例输出
6
评测用例规模与约定 对于 30% 的评测用例,1 ≤ n ≤ 1000, 1 ≤ K ≤ 20, 1 ≤ Ai ≤ 104。
对于所有评测用例,1 ≤ n ≤ 105,1 ≤ K ≤ 105,1 ≤ Ai ≤ 109。
code:(蛮力,30%)
//对于 30% 的评测用例,可以直接用暴力循环
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
int len(int a){
int len=0;
while(a){
len++;
a/=10;
}
return len;
}
int isok(int a,int b,int k){
int len_b=len(b);
int sum=a*pow(10,len_b)+b;
if(sum%k==0){
return 1;
}else{
return 0;
}
}
int main()
{
int n,k;
scanf("%d %d",&n,&k);
int a[n];
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
int ans=0;
for(int i=0;i<n-1;i++){
for(int j=i+1;j<n;j++){
if(isok(a[i],a[j],k)==1){
ans++;
}
if(isok(a[j],a[i],k)==1){
ans++;
}
}
}
printf("%d",ans);
return 0;
}
code2:
//...