解题思路:预处理每个数乘以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分
6 人评分
C语言程序设计教程(第三版)课后习题6.5 (C语言代码)浏览:760 |
C语言程序设计教程(第三版)课后习题5.7 (C语言代码)浏览:968 |
C语言程序设计教程(第三版)课后习题5.7 (C语言代码)浏览:585 |
母牛的故事 (C语言代码)浏览:945 |
DNA (C语言代码)浏览:395 |
用筛法求之N内的素数。 (C语言代码)浏览:531 |
C语言程序设计教程(第三版)课后习题12.1 (C语言代码)浏览:649 |
C语言程序设计教程(第三版)课后习题11.1 (C语言代码)浏览:478 |
母牛的故事 (java语言代码)浏览:880 |
C语言程序设计教程(第三版)课后习题10.4 (C语言代码)浏览:629 |