2106孙远平


私信TA

用户名:uq_72590920377

访问量:1578

签 名:

等  级
排  名 686
经  验 3852
参赛次数 49
文章发表 4
年  龄 0
在职情况 学生
学  校
专  业

  自我简介:

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

看不懂代码?想转换其他语言的代码? 或者想问其他问题? 试试问问AI编程助手,随时响应你的问题:

编程语言转换

万能编程问答  

代码解释器

代码纠错

SQL生成与解释

  评论区