模数强度,要说明在算法中用来计算的答案
Modulo strength , want explanation in the algorithm used to compute the answer
我试图解决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
的对数进行求和。
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 递归函数计算序列中的平方和(并输出过程)
- 欧拉项目#8答案是大以获得有效答案
- (C++)分析树以计算返回错误值的简单算术表达式
- 我的字符计数代码计算错误.为什么
- C 给我2个基本计算的不同答案
- 使用幂函数的计算给出了大数字的错误答案
- 我正在尝试编写一个简单的计算程序,但答案一直返回为 0
- 如果遵循IEEE 754的两种语言,则两种语言的计算都会产生相同的答案
- 一个简单的C 功能,在不同的计算机上具有不同的答案
- 如何计算循环中正确答案的数量
- 无法计算如何从联机答案中返回c++函数的多个值
- 为什么此代码不显示计算的正确答案,为什么它会无限循环?
- 如何计算对该函数的递归调用,以及正确答案是什么
- 计算函数中的模给出了与直接使用%运算符不同的答案
- 计算未输出预期答案
- 使用迭代和递归计算阶乘时的不同答案
- 在计算cpp中数字的n次方根时,答案错误
- 阶乘在main中显示错误的答案.在函数中正确计算
- 浮点数——为什么c++对看似相同的计算给出了不同的答案?