卡80分求助,有两个点过不了
查看原帖
卡80分求助,有两个点过不了
389777
Zishanxiao_qi楼主2024/3/27 23:32
#include<bits/stdc++.h>

using namespace std;

long long num[400001],weishu[400001],lg[400001],hash_1[400001][20];//hash_1[i][j]用来存放这个数乘以10的j次方后%k等于i的个数

long long work(long long x){//返还位数
	long long ans=0;
	while(x){
		ans++;
		x/=10;
	}
	return ans;
}

int main(){
	int n,K;
	lg[0]=1;
	for(int i=1;i<=11;i++){
		lg[i]=lg[i-1]*10;//初始化10的次方
	}
	cin>>n>>K;
	for(int i=1;i<=n;i++){
		cin>>num[i];
		for(int j=0;j<=11;j++){
			hash_1[((long long)(lg[j]%K)*(long long)(num[i]%K))%K][j]++;
		}
	}
	long long ans=0;
	for(int i=1;i<=n;i++){
		ans+=hash_1[(K-num[i]%K)%K][work(num[i])];
		if(((lg[work(num[i])]%K)*(num[i]%K))%K==(K-num[i])%K){//如果两者一样,则答案要减一即是aiai的情况。
			ans-=1;
		}
	} 
	cout<<ans;
	return 0;
}
2024/3/27 23:32
加载中...