Codeforces Round 871 (Div. 4)——G题讲解

蒟蒻来讲题,还望大家喜。若哪有问题,大家尽可提!

Hello, 大家好哇!本初中生蒟蒻讲解一下G. Hits Different!
在这里插入图片描述
上绿名喽!

===========================================================================================

G. Hits Different

题目描述

In a carnival game, there is a huge pyramid of cans with 2023 rows, numbered in a regular pattern as shown.

在这里插入图片描述

If can 9 2 9^2 92 is hit initially, then all cans colored red in the picture above would fall.

You throw a ball at the pyramid, and it hits a single can with number n 2 n^2 n2. This causes all cans that are stacked on top of this can to fall (that is, can n 2 n^2 n2 falls, then the cans directly above n 2 n^2 n2 fall, then the cans directly above those cans, and so on). For example, the picture above shows the cans that would fall if can 9 2 9^2 92 is hit.

What is the sum of the numbers on all cans that fall? Recall that n 2 = n × n n^2=n×n n2=n×n.

Input

The first line contains an integer t ( 1 ≤ t ≤ 1000 ) t (1≤t≤1000) t(1t1000) — the number of test cases.

The only line of each test case contains a single integer n ( 1 ≤ n ≤ 1 0 6 ) n (1≤n≤10^6) n(1n106) — it means that the can you hit has label n 2 n^2 n2.

Output

For each test case, output a single integer — the sum of the numbers on all cans that fall.

Please note, that the answer for some test cases won’t fit into 32-bit integer type, so you should use at least 64-bit integer type in your programming language (like long long for C++). For all valid inputs, the answer will always fit into 64-bit integer type.

Example

在这里插入图片描述
Note
The first test case is pictured in the statement. The sum of the numbers that fall is
1 2 + 2 2 + 3 2 + 5 2 + 6 2 + 9 2 = 1 + 4 + 9 + 25 + 36 + 81 = 156. 1^2+2^2+3^2+5^2+6^2+9^2=1+4+9+25+36+81=156. 12+22+32+52+62+92=1+4+9+25+36+81=156.
In the second test case, only the can labeled 1 2 1^2 12 falls, so the answer is 1 2 = 1 1^2=1 12=1.
In the third test case, the cans labeled 1 2 1^2 12 and 2 2 2^2 22 fall, so the answer is 1 2 + 2 2 = 1 + 4 = 5 1^2+2^2=1+4=5 12+22=1+4=5.
In the fourth test case, the cans labeled 1 2 1^2 12 and 3 2 3^2 32 fall, so the answer is 1 2 + 3 2 = 1 + 9 = 10 1^2+3^2=1+9=10 12+32=1+9=10.
In the fifth test case, the cans labeled 1 2 , 2 2 1^2, 2^2 12,22, and 4 2 4^2 42 fall, so the answer is 1 2 + 2 2 + 4 2 = 1 + 4 + 16 = 21. 1^2+2^2+4^2=1+4+16=21. 12+22+42=1+4+16=21.

思路

本题可以想到动态规划,我们可以这样考虑:
在这里插入图片描述
假设砸 1 4 2 14^2 142这个点,我们看一下怎么转移:
在这里插入图片描述
红色的是 1 4 2 14^2 142左边这个点 7 2 7^2 72这个点所能波及到的点
在这里插入图片描述
绿色的是 1 4 2 14^2 142右边的点 8 2 8^2 82所能波及到的点

然后我们看一下他们重复了那些点:
在这里插入图片描述
其实就是 1 4 2 14^2 142上一行的上一行的左边的点 4 2 4^2 42所能波及到的点

故此,砸 1 4 2 14^2 142的值应该是砸 7 2 7^2 72的值+砸 8 2 8^2 82的值-砸 4 2 4^2 42的值+ 1 4 2 14^2 142

可以推导出状态转移方程:( d p [ i ] [ j ] dp[i][j] dp[i][j]表示砸图中第i行第j列的点的答案)
d p [ i ] [ j ] = d p [ i − 1 ] [ j ] + d p [ i − 1 ] [ j − 1 ] − d p [ i − 2 ] [ j − 1 ] + n u m [ i ] [ j ] dp[i][j] = dp[i -1][j]+dp[i-1][j-1]-dp[i-2][j-1]+num[i][j] dp[i][j]=dp[i1][j]+dp[i1][j1]dp[i2][j1]+num[i][j]

其中, n u m [ i ] [ j ] num[i][j] num[i][j]表示图中第i行第j列的数字

本题就是求 d p [ 1 − 2023 ] [ 1 − 2023 ] dp[1-2023][1-2023] dp[12023][12023]的值
时间复杂度 O ( n 2 ) O(n^2) O(n2)

题中是输入的 n n n我们找到他是第几行,第几列即可!

代码

#include <iostream>
#define int long long

using namespace std;

const int N = 2024;

int dt;
int n;
int dp[N][N];
int num[N][N];
int sum[N];

signed main()
{
	cin.tie(0);
	cout.tie(0);
	ios::sync_with_stdio(0);
	
	int t = 1;
	for (int i = 1; i <= 2023; i ++)
		for (int j = 1; j <= i; j ++)
			num[i][j] = t * t, t ++;
			
	sum[1] = 1;
	for (int i = 2; i <= 2023; i ++)
		sum[i] = sum[i - 1] + i - 1;
	
	dp[1][1] = 1;
	for (int i = 2; i <= 2023; i ++)
		for (int j = 1; j <= i; j ++)
			dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j] - dp[i - 2][j - 1] + num[i][j];
	
	cin >> dt;
	
	while (dt --)
	{
		cin >> n;
		
		int h;
		for (int i = 1; i <= 2023; i ++)
			if (n < sum[i])
			{
				h = i - 1;
				break;
			}
		
		cout << dp[h][n - sum[h] + 1] << endl;
	}
	
	return 0;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值