P5174

· · 个人记录

一切开始之前,我们先推导一个引理:

\large{ \begin{aligned} &f(n)=\sum_{i=0}^ni^2,n\ge0\\ &f(n)=\frac{n(n+1)(2n+1)}{6} \end{aligned} }

这里提供五种推导它的方法。

一、查找法

通过搜索引擎,题解,文献等,我们找到了这个公式:

\large f(n)=\frac{n(n+1)(2n+1)}{6}

[doge]

二、归纳法

\large \begin{aligned} &f(n)=\frac{n(n+1)(2n+1)}{6}\\ &=\frac{n(n+1)(n+\frac{1}{2})}{3}\\ &\\ &f(0)=0\\ &f(n)=f(n-1)+n^2\\ &3f(n)=(n-1)n(n-\frac{1}{2})+3n^2\\ &=(n^3-\frac{3}{2}n+\frac{1}{2}n)+3n^2\\ &=n^3+\frac{3}{2}n^2+\frac{1}{2}n\\ &=n(n+\frac{1}{2})(n+1)\\ &\text{故对于所有的}n\ge0,f(n)=\frac{n(n+1)(2n+1)}{6} \end{aligned}

三、二重合式展开与收缩

\large \begin{aligned} &f(n)=\sum_{k=1}^nk^2\\ &=\sum_{j=1}^n\sum_{k=j}^nk\\ &=\sum_{j=1}^n\frac{j+n}{2}(n-j+1)\\ &=\frac{1}{2}\sum_{j=1}^n(n(n+1)+j-j^2)\\ &=\frac{1}{2}n^2(n+1)+\frac{1}{4}n(n+1)-\frac{1}{2}f(n)\\ &=\frac{1}{2}n(n+\frac{1}{2})(n+1)-\frac{1}{2}f(n)\\ &\\ &\frac{3}{2}f(n)=\frac{1}{2}n(n+\frac{1}{2})(n+1)\\ &f(n)=\frac{n(n+1)(2n+1)}{6} \end{aligned}

\sum_{k=1}^nk^2=\sum_{j=1}^n\sum_{k=j}^nk 的解释:

我们知道,一个数 n 加和 n 次,就是 n^2

将右式展开:

1+2+3+4+5+6+...+n
  2+3+4+5+6+...+n
    3+4+5+6+...+n
      4+5+6+...+n
        5+6+...+n
          6+...+n
            ...
            ...+n

刚好每个数 kk 次,与原式等价。

四、瞎搞法

利用恒等式 \large(n+1)^3=n^3+3n^2+3n+1,可以得到:

\large \begin{aligned} &(n+1)^3-n^3=3n^2+3n+1\\ &n^3-(n-1)^3=3(n-1)^2+3(n-1)+1\\ &\cdots\cdots\\ &2^3-1^3=3*(1^2)+3*1+1 \end{aligned}

把这 \large n 个等式两端分别相加,得:

\large \begin{aligned} &(n+1)^3-1\\ &=3\times\frac{n(n+1)}{2}+n+3\sum_{i=1}^ni^2\\ &n^3+3n^2+3n\\ &=3\times\frac{n(n+1)}{2}+n+3\sum_{i=1}^ni^2\\ \end{aligned}

整理后得:

\large\sum_{i=1}^ni^2=\frac{n(n+1)(2n+1)}{6}

五、扰动法

这是最实用的方法。

对于 f(n+1),抽出 (n+1)^2,0^2

\large \begin{aligned} &f(n)+(n+1)^2\\ &=\sum_{k=0}^n(k+1)^2\\ &=\sum_{k=0}^n(k^2+2k+1)\\ &=\sum_{k=0}^nk^2+2\sum_{k=0}^nk+\sum_{k=0}^n1\\ &=f(n)+2\sum_{k=0}^nk+(n+1)\\ &\\ &\sum_{k=0}^nk=\frac{1}{2}((n+1)^2-(n+1))=\frac{n(n+1)}{2} \end{aligned}

额。。。有个毛用?

等等,二次幂可以推出一次幂求和,那是不是三次幂可以推出二次幂求和?

\large g(n)=\sum_{k=0}^nk^3

g(n) 中抽出 (n+1)^3, 0^3

\large \begin{aligned} &g(n)+(n+1)^3\\ &=\sum_{k=0}^n(k+1)^3\\ &=\sum_{k=0}^n(k^3+3k^2+3k+1)\\ &=\sum_{k=0}^nk^3+3\sum_{k=0}^nk^2+3\sum_{k=0}^nk+\sum_{k=0}^n1\\ &=g(n)+3f(n)+\frac{3n(n+1)}{2}+(n+1)\\ &\\ &3f(n)=(n+1)^3-\frac{3n(n+1)}{2}-(n+1)\\ &=n^3+3n^2+3n+1-\frac{3n^2+3n}{2}-n-1\\ &=n^3+\frac{3n^2}{2}+\frac{n}{2}\\ &=(n+1)(n+\frac{1}{2})n\\ &\\ &f(n)=\frac{n(n+1)(n+\frac{1}{2})}{3} \end{aligned}

通过此方法,我们可以从 n+1 次幂推出 n 次幂!!!

你可以试着推一推其他更高次幂的求和。

好,接下来回归题目:

1\sqrt{R} 枚举 x,那 y 的最大值为 \sqrt{R-x^2},因为再大会超出这个圆。

当然 y 向下取整。

相加即可。 ```c++ #include <bits/stdc++.h> #define int long long #define le double #define mod 1000000007 using namespace std; inline int qpow (int a, int b) { int res = 1; while (b) { (b & 1) and (res = res * a % mod); a = a * a % mod; b >>= 1; } return res; } int r, ans, k, inv; signed main () { inv = qpow (6, mod - 2); // 在取模情况下,除法最好使用逆元 cin >> r; for (int x = 0, y; x * x <= r; x++) { y = sqrt ((le) r - x * x); k = (y * (y + 1) % mod * (y * 2 % mod + 1) % mod) * inv % mod + (x * x % mod * y % mod) % mod;; ans = (ans + k) % mod; } cout << ans * 4 % mod; } ```