题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=5734
题目有点长,直奔最后两段就行。
此题在于有的做法会爆long long
这种:
ans1爆了 long long
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <cstring>
#include <map>
#include <vector>
#include <queue>
#include <cmath>
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b)
{
return b?gcd(b,a%b):a;
}
long long a[100009];
int main()
{
int t,n;
scanf("%d",&t);
long long sum,ans1,ans2;
while(t--)
{
sum=0;
ans1=ans2=0;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%lld",&a[i]);
for(int i=0;i<n;i++)
sum+=fabs(a[i]);
for(int i=0;i<n;i++)
{
a[i]=a[i]*n;
}
for(int i=0;i<n;i++)
{
if(a[i]<0)
{
ans1+=(a[i]+sum)*(a[i]+sum);
}
else
ans1+=(a[i]-sum)*(a[i]-sum);
}
ans2=n*n;
if(ans1==0)
printf("0/1\n");
else
{
long long ans=gcd(ans1,ans2);
printf("%lld/%lld\n",ans1/ans,ans2/ans);
}
}
return 0;
}
需要展开化简一下
AC代码
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <cstring>
#include <map>
#include <vector>
#include <queue>
#include <cmath>
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b)
{
return b?gcd(b,a%b):a;
}
long long a[100009];
int main()
{
int t,n;
scanf("%d",&t);
long long sum,ans1,ans2;
while(t--)
{
sum=0;
ans1=ans2=0;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%lld",&a[i]);
for(int i=0;i<n;i++)
sum+=fabs(a[i]);
for(int i=0;i<n;i++)
{
ans1+=n*a[i]*a[i];
}
ans1=ans1-sum*sum;
if(ans1==0)
printf("0/1\n");
else
{
long long ans=gcd(ans1,n);
printf("%lld/%lld\n",ans1/ans,n/ans);
}
}
return 0;
}