解题思路:预处理每个数乘以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.0分

5 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论