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;
}

浙公网安备 33010602011771号