题目
T(T<=100)组样例,每次给定n(n<=1000)个数,第i个数ei(-1000<=ei<=1000),
你需要添加最多k个[-1e18,1e18]范围内的整数,
使得这n+k个数的平方和与和的平方相等,即
如果无论如何也不能相等,输出IMPOSSIBLE
小范围:k=1
大范围:k<=1000
思路来源
官方题解
题解
考虑k=1的时候怎么做,设要添加的数为x,移项解出x的值,
,
即不妨称为n个数的和,
为n个数的平方和,
在k>1时,分母2*sum启发我们,不妨尝试令新的和为1,
则需要先补一个的值,
对应的新的平方和
即有,
注意到为奇数,说明当前n+1个数中有奇数个奇数,
则其平方和也必为奇数,即必为偶数,
必为整数
这表明,k>1时一定有解,且补上两个数、
即可
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e3+10;
int t,n,k;
ll a[N];
int main(){
scanf("%d",&t);
for(int ca=1;ca<=t;++ca){
scanf("%d%d",&n,&k);
ll sum=0,sum2=0,ans;
printf("Case #%d: ",ca);
for(int i=1;i<=n;++i){
scanf("%lld",&a[i]);
sum+=a[i];sum2+=a[i]*a[i];
}
if(k>=2){
sum2+=1ll*(1-sum)*(1-sum);
printf("%lld ",1-sum);
sum=1;
}
if(!sum){
if(sum*sum==sum2){
puts("0");
}
else{
puts("IMPOSSIBLE");
}
continue;
}
if((sum2-sum*sum)%(2ll*sum)){
puts("IMPOSSIBLE");
}
else{
ans=(sum2-sum*sum)/(2ll*sum);
printf("%lld\n",ans);
}
}
return 0;
}