题目链接
https://www.lydsy.com/JudgeOnline/problem.php?id=1429
题解
题目相当于求
x2+x+y2+y+z2+z+w2+w=2N
即
(2x+1)2+(2y+1)2+(2z+1)2+(2w+1)2=4(2N+1)(*)
设S(i)表示i能拆成多少个由4个数的平方组成的和,d(i)表示i的约数和,由雅可比的四方定理(证明:arXiv:math/9206203),得到:
S(n)=S(2km)={8d(m)24d(m)k=0k≥1
其中n=2km,m为奇数。
而(∗)式的解的个数可以表示成x2+y2+z2+w2=4(2N+1)的解的个数减去(2x)2+(2y)2+(2z)2+(2w)2=4(2N+1)的解的个数并除去奇偶性和正负号的影响,即
16S(4(2N+1))−S(2N+1)=d(2N+1)
O(n)求d(2N+1)即可。
代码
#include <cstdio>
long long n,ans;
int main()
{
scanf("%lld",&n);
n=n*2+1;
for(long long i=1; i*i<=n; ++i)
{
if(n%i==0)
{
ans+=i;
if(i*i<n)
{
ans+=n/i;
}
}
}
printf("%lld\n",ans);
return 0;
}