Now what i did was similar to editorial. The problem isnt with the approach but with the fact that if use operation ans+=(n*(n-1))/2
i get wrong answer due to integer overflow, now I AM using long long
but still it gives -ve answer in 2nd test case which is ofcourse due to overflow. To solve this what i did was first divide n or (n-1) by 2 (depending upon parity) and then multiplying and got answer accepted. Can someone tell why this is happening?? I know i would probably be a very dumb mistake but plz dont judge harshly. :D
MY CODE:
#include<bits/stdc++.h>
using namespace std;
//void swap(int &a,int &b){
// int tmp=a;a=b;b=tmp;
//}
int size(long long a){
int n=0;
while(a!=0){
n++;
a/=2;
}
return n;
}
int main(){
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int t,n;
cin>>t;
while(t--){
cin>>n;
long long A[n],ans=0;
for(int i=0;i<n;i++)cin>>A[i];
` `
vector<int>nums(32,0);
for(int i=0;i<n;i++){
nums[size(A[i])]++;
}
for(int i=0;i<32;i++){
// long long a=nums[i],b=nums[i]-1;
// if(nums[i]%2==0){
// a/=2;
// }
// else{
// b/=2;
// }
// ans+=(a*b);
ans+=((nums[i]*(nums[i]-1))/2);
}
cout<<ans<<"\n";
}
` `
return 0;
}
Try with a vector of long long.
That worked, but i am curious that vector should be sufficient since there are only 10^5 elements in total and i am using the vector to store number of occurences (with size i) which obviously can't be more than 10^5 for any test case!
nums[i]*(nums[i]-1)
overflows theint
limit whennums[i]=10^5
.whether the answer overflows or not, doesn't it depend on the size of containor which is long long , in this case. Or it does on the operands too?
nums[i] is an int, so multiplying two of them yields an int, which overflows. The value (which has overflowed) is stored as a long long, but since it overflowed the answer is wrong.
Thank you for solving my tasks!
learned a lot, so thank YOU