EZOJ#583. 【2020联赛训练1】签到题

题目链接:签到题

题目描述:



题目分析

解法一:

通过分析可以发现答案为\(1^2+2^2+...+n^2\),暴力计算,时间复杂度\(O(n)\),枚举输出结果可以获得\(60\)分.

解法二

对于上述式子,存在一个通项公式,为\(1^2+2^2+...+n^2=\frac{n(n+1)(2n+1)}{6}\).时间复杂度O(1),可以获得90分

对于通项公式,进行一个简单的证明:

\[\because (n+1)^3=n^3+3n^2+3n+1 \]

\[\therefore (n+1)^3-n^3=3n^2+3n+1 \]

\[n^3-(n-1)^3=3(n-1)^2+3(n-1)+1 \]

\[...... \]

\[3^3-2^3=3*2^2+3*2+1 \]

\[2^3-1^3=3*1^2+3*1+1 \]

\[将这n个等式两边分别相加,得 \]

\[(n+1)^3-1^3=3(1^2+2^2+3^2+...+n^2)+3(1+2+3+...+n)+n \]

\[移项 \]

\[得1^2+2^2+...+n^2=\frac{n(n+1)(2n+1)}{6} \]

另外10分需要写一个高精度
代码

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <string>
using namespace std;

typedef long long LL;

vector<int> ans;

void mul(vector<int> &A, int b) {
	int t = 0;
	for (int i = 0; i < A.size() || t; i++) {
		if (i < A.size()) t += A[i] * b;
		ans.push_back(t % 10);
		t /= 10;
	}
	while (ans.size() > 1 && ans.back() == 0)
		ans.pop_back();
}

int main() {
	LL a, b;
	cin >> a;
	b = (a + 1);
	LL c = (2 * a + 1);
	if (a % 2 == 0) a /= 2;
	else if (b % 2 == 0) b /= 2;
	if (a % 3 == 0) a /= 3;
	else if (b % 3 == 0) b /= 3;
	else if (c % 3 == 0) c /= 3; 
	LL tmp = a * b;
	vector<int> T;
	while (tmp) {
		T.push_back(tmp % 10);
		tmp /= 10;
	}
	mul(T, c);
	for (int i = ans.size() - 1; i >= 0; i--)
		cout << ans[i];
	return 0;
}
posted @ 2020-09-19 23:00  lew2018  阅读(122)  评论(0)    收藏  举报
Live2D