模数强度,要说明在算法中用来计算的答案

Modulo strength , want explanation in the algorithm used to compute the answer

本文关键字:计算 答案 算法 说明      更新时间:2024-09-28

我试图解决hackerearth的Modulo强度问题,
https://www.hackerearth.com/practice/basic-programming/implementation/basics-of-implementation/practice-problems/golf/modulo-strength-4/,
所以基本上我们必须找到所有这样的no对(比如i,j(,这样A[i]%k=A[j]%k,其中k是问题中给出的no。
我尝试了暴力方法,在最后的一些测试用例中超过了时间限制。
在讨论选项卡中,我发现了一个正在工作的代码,但我不明白它到底做了什么,以及所使用算法背后的基本思想。

#include <bits/stdc++.h>
using namespace std;
#define int long long
int32_t main() {
int n,k,s=0;
cin>>n>>k;
int a[n];
vector<int>v(k,0);  // Specially this part ,what does it store?
for(int i=0;i<n;i++)
{   
cin>>a[i];
v[a[i]%k]++;   
}
for(int i=0;i<k;i++)
{
s+=v[i]*(v[i]-1);
}
cout<<s;
}

这是代码,我想理解它,这样我就可以将这个逻辑应用于其他问题。

有一些问题;

  • "bits/stdc++.h";不是标准标头
  • 可变长度数组,如int a[n],是非标准的,很容易出现运行时错误(这也是完全不必要的(
  • #define int long long使代码具有未定义的行为

这是一个固定版本,有一些小的重命名和澄清注释:

#include <iostream>
#include <vector>
int main() {
long long n, k;
cin >> n >> k;
// There are k groups of friends.  
std::vector<int> friends(k);
// Count how many people there are in each group.  
for(int i = 0; i < n; i++)
{   
int x;
std::cin >> x;
friends[x%k]++;   
}
long long sum = 0;
for(int i = 0; i < k; i++)
{
// In a group of N mutual friends, each person has N-1 friends. 
sum += friends[i] * (friends[i]-1);
}
std::cout << sum;
}

让我们首先了解代码中每个变量的用途。

明确给出了CCD_ 3的作用。a[n]用于读取数组中的数字。std::vector<int>v(k,0)存储0的k大小的矢量,并且v[i]指示a[n]a[j]%k==i所针对的变量的数量。

在最后一个循环中,完成了以下操作。可以用n元素构造的对数是n*(n-1)(基本组合数学(,如果我们有满足条件的v[i]数和a[j]%k==i,则可以构造的对数为v[i]*(v[i]-1)。该循环对每个残差i的对数进行求和。