oj1066: Cube

题目要求
描述
作为UESTC应用数学学校的学生,WCM喜欢数学。有一天,他发现了一个有趣的定理,即每个正整数的立方都可以表示为一些连续奇数正整数的总和。例如,11 * 11 * 11 = 1331 = 111 + 113 + 115 + 117 + 119 + 121 + 123 + 125 + 127 + 129 + 131面对如此完美的定理,WCM感到非常激动。但是他不知道如何证明这一点。他向他的好朋友汤姆·里德尔(Tom Riddle)寻求帮助。汤姆·里德尔(Tom Riddle)是美国电子科技大学计算机科学学院的学生,擅长编程。他使用计算机轻松证明了定理的有效性。还可以吗?给定一个正整数N,您应该确定如何将此数字表示为N个连续的奇数正整数之和。您只需要输出N个整数中最小和最大的数字即可。
输入值
输入的第一行包含一个整数,该整数指示测试用例的数量。每个测试用例在一行上都包含一个正整数N(0 <N≤1000)。
输出量
对于每个测试用例,在一行上输出两个整数,这是N个连续的奇数正整数中的最小和最大数字,其和为N * N *N。
Sample Input
2
11
3
Sample Output
Raw
111 131
7 11
一个数的立方等于连续几个奇数项之和,如
8=3+5 ……2
27=7+9+11……3
64=13+15+17+19……4
125=21+23+25+27+29……5
216=31+33+35+37+39+41……6
因为奇数是奇数个数字相加,偶数是偶数个数字相加
从中可以发现奇数中间的数字为n*n*n/n,偶数中间两个数字之和为n*n*n/n*2
因此只要知道中间数字最大值max和最小值min都可以根据n和中间数mid关系解出

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<queue>
#include<math.h>
#include<stdio.h>
#include<string.h>
using namespace std;
int main()
{
	int n, m, t;
	cin >> n;
	while (n--)
	{
		cin >> m;
		t = m;
		long long max;
		max = m * m * m;
		int mid;
		mid = max / t;
		if(m%2==1)
			cout << mid - 2 * ((t - 1) / 2)<<" "<<mid+ 2 * ((t - 1) / 2) << endl;
		else
		{
			int left, right;
			left = mid - 1;
			right = mid + 1;
			if (left + right == max)
				cout << left << " " << right << endl;
			else
				cout << left - 2 * ((t - 1) / 2) << " " << right + 2 * ((t - 1) / 2) << endl;
		}
	}
	return 0;
}
发布了38 篇原创文章 · 获赞 27 · 访问量 3182

猜你喜欢

转载自blog.csdn.net/qq_45891413/article/details/104955359