题意:
就是给你一个数组,这个数组是由anw数组构造出来的,是anw[1]对1,2,3的贡献分别为anw[1],2anw[1],3anw[1]。anw[2]对1,2,3的贡献为3anw[2],anw[2],2anw[2]。anw[3]对1,2,3的贡献为2anw[3],3anw[3],anw[3]。就是这种环形的构造。然后让你求出来这个数组anw。
思考:
当然这种题明显是构造的题目,只能去推公式找结论,这种不妨就从3个数开始模拟,把式子退出来.
b[1] = anw[1]+3anw[2]+2anw[3]
b[2] = 2anw[1]+anw[2]+3anw[3]
b[3] = 3anw[1]+2anw[2]+anw[3]
然后三项相加得b[1]+b[2]+b[3] = 6anw[1]+ 6anw[2]+ 6anw[3]。很明显,这个6是n*(n+1)/2。
然后两项相减得b[1]-b[2] = -anw[1]+2anw[2]-anw[3]
移项可得2anw[2] = b[1]-b[2]+anw[1]+anw[3]
两边都加anw[2]得3anw[2] = b[1]-b[2]+anw[1]+anw[2]+anw[3]
然后可以推出anw[2],同理anw[1]…anw[n]
要判断的就是NO的时候,如果b数组的总和sum不能整除n(n+1)/2错,如果res<也错
如果求anw的过程中,anw<=0或者anw>1e9也是错的。
代码:
int T,n,m;
int va[N];
int anw[N];
signed main()
{
IOS;
cin>>T;
while(T--)
{
cin>>n;
int sum = 0,suc = 1;
for(int i=1;i<=n;i++)
{
cin>>va[i];
sum += va[i];
}
int res = sum/(n*(n+1)/2);
if(sum%(n*(n+1)/2)!=0||res<n) suc = 0;
for(int i=1;i<=n;i++)
{
int cnt = 0;
if(i==1) cnt = va[n]-va[i]+res;
else cnt = va[i-1]-va[i]+res;
anw[i] = cnt/n;
if(anw[i]<=0||anw[i]>1e9||cnt%n!=0) suc = 0;
}
if(!suc) cout<<"NO\n";
else
{
cout<<"YES\n";
for(int i=1;i<=n;i++) cout<<anw[i]<<" ";
cout<<"\n";
}
}
return 0;
}
总结:
多动手写一写,不要总想光靠脑子想,推一推就出来了。