解题思路:预处理每个数乘以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、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复