DestinHistoire

 

BZOJ-1429 方程的解(雅可比四平方和定理)

题目描述

  令 \(f(x)=\displaystyle\sum_{i=1}^{x}i\),求不定方程 \(f(x)+f(y)+f(z)+f(w)=n(0\leq n\leq 10^{12})\) 的个数。

分析

  化简一下式子:

\[\frac{x(x+1)}{2}+\frac{y(y+1)}{2}+\frac{z(z+1)}{2}+\frac{w(w+1)}{2}=n \]

  即:

\[(2x+1)^2+(2y+1)^2+(2z+1)^2+(2w+1)^2=4(2n+1) \]

  根据 Jacobi's four-square theorem

\[r_4(n)=\begin{cases}8\displaystyle\sum_{m\mid n}m&n为奇数\\ 24\displaystyle\sum_{m\mid n且m为偶数}m& n为偶数 \end{cases} \]

  其中 \(r_4(n)\) 表示 \(n\) 能拆成多少种由四个数的平方组成的和。

  不难发现,上式也可以写成如下形式:

\[r_4(n)=r_4(2^kx)=\begin{cases}8\sigma(n)&k=0\\ 24\sigma(n)&k\geq 1 \end{cases} \]

  其中 \(n=2^kx\)\(x\) 为奇数。

  原式求的是四个数都为奇数的方案,因此用所有方案减去四个数都为偶数的方案即可得到原式的方案(还需要保证均为正数,所以方案数需要除 \(16\)),即:

\[\frac{r_4(4(2n+1))-r_4(2n+1)}{16}=\frac{24\sigma(2n+1)-8\sigma(2n+1)}{16}=\sigma(2n+1) \]

代码

#include<bits/stdc++.h>
using namespace std;
int main()
{
    long long n;
    cin>>n;
    n=n*2+1;
    long long ans=0;
    for(long long i=1;i*i<=n;i++)
    {
        if(n%i==0)
        {
            ans=ans+i;
            if(i*i<n)
                ans=ans+n/i;
        }
    }
    cout<<ans<<endl;
    return 0;
}

posted on 2020-12-06 21:19  DestinHistoire  阅读(220)  评论(0编辑  收藏  举报

导航