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) 编辑 收藏 举报