Singers‘ Tour-(推式子+思维)

DIV3-E

题意:
就是给你一个数组,这个数组是由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]
移项可得2
anw[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;
}

总结:
多动手写一写,不要总想光靠脑子想,推一推就出来了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值