不能想当然认为数据一定小于long long
一定要仔细判断数据范围!
一定要仔细判断数据范围!
一定要仔细判断数据范围!
如果不行了,就可以用赖皮方法,__int128(两个下划线)
__int128只能用于数据中间处理,不能用作输入输出。
用法:
#include <bits/stdc++.h>
#define endl '\n'
#define int long long
#define pii pair<int,int>
#define pb push_back
#define rep(i,l,r) for (int i=l;i<=r;i++)
#define nep(i,r,l) for (int i=r;i>=l;i--)
#define CIO std::ios::sync_with_stdio(false)
using namespace std;
const int INF=0x3f3f3f3f;
const int N=2e6+5;
int aa[N];
int bb[N];
map<int,int> m;
void lg(int x){
int cnt=0;
while (x){
if (x&1) m[cnt+1]++;
x=x/2;
cnt++;
}
}
int ansz,ansm;
__int128 gcd(__int128 a,__int128 b){
if (b==0) return a;
return gcd(b,a%b);
}
int pre[40];
void work(){
int n;cin>>n;
int sum=0;
rep(i,1,n){
cin>>aa[i];
sum+=aa[i];
lg(aa[i]);
}
int SUM=sum;
pre[1]=1;
rep(i,2,30){
pre[i]=pre[i-1]*2;
}
rep(i,1,30){
rep(j,1,m[i]){
bb[j]+=pre[i];
}
}
__int128 ans=0;
__int128 zhuan=0;
rep(i,1,n){
zhuan=(bb[i]*n-SUM);
zhuan*=(bb[i]*n-SUM);
ans+=zhuan;
}
__int128 nn=n*n*n;
__int128 g=gcd(ans,nn);
int ans1=ans/g;
int ans2=(n*n*n)/g;
if (ans==0) cout<<"0/1";
else cout<<ans1<<"/"<<ans2;
}
signed main(){
CIO;
//int _;cin>>_;while(_--)
{
work();
}
return 0;
}