解题思路:预处理每个数乘以10的1~10的次方,并且对k取模,存在nums[N][11]内,从1~n遍历一遍输入的数据(nums[i]放在后面,这次遍历已经包括所有组合了),把以Ai的位数和(k-nums2[i]%k)%k为下标的数据加起来,如果自己本身出现在此就要去重(k-nums2[i]%k)%k==(nums2[i]%k*pow1(f(nums2[i]))%k)%k注意
这里个数还要不能为0.才能去重。
注意事项:注意去重和取模
参考代码:
//f(),pow1()函数都可以调用库函数代替
#include<iostream>
#include<unordered_map>
#include<vector>
#include<deque>
#include<algorithm>
#include<map>
#include<set>
#include<cstring>
#include<cmath>
#include<queue>
#include<stack>
#define int unsigned long long
using namespace std;
typedef long long ll;
const int N=1e5+1000;
int n,m;
int nums2[N],nums1[N][11];//第一个Ai乘10^j mod k,第二个Aj%* 10^ mod k
//int nums[11][N];
int f(int x){
int cnt=0;
while(x>0){
cnt++;
x/=10;
}
return cnt;
}
int pow1(int x){
int cnt=1;
while(x--){
cnt*=10;
//x/=10;
}
return cnt;
}
void solve(){
int k;
cin>>n>>k;
for(int i=1;i<=n;i++){
scanf("%lld",&m);
nums2[i]=m;
for(int j=1;j<=10;j++){
nums1[((m%k)*((pow1(j))%k))%k][j]++;
}
}
int cnt=0;
for(int i=1;i<=n;i++){
cnt=cnt+nums1[(k-nums2[i]%k)%k][f(nums2[i])];
if((k-nums2[i]%k)%k==(nums2[i]%k*pow1(f(nums2[i]))%k)%k&&nums1[(k-nums2[i]%k)%k][f(nums2[i])]) cnt-=1;
}
cout<<cnt<<endl;
}
signed main(){
int t=1;
//cin>>t;
while(t--) solve();
}0.0分
5 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复