题目链接

https://www.lydsy.com/JudgeOnline/problem.php?id=1429

题解

题目相当于求
x2+x+y2+y+z2+z+w2+w=2N x^2+x+y^2+y+z^2+z+w^2+w=2N

(*)(2x+1)2+(2y+1)2+(2z+1)2+(2w+1)2=4(2N+1) (2x+1)^2+(2y+1)^2+(2z+1)^2+(2w+1)^2=4(2N+1) \tag{*}
S(i)S(i)表示ii能拆成多少个由4个数的平方组成的和,d(i)d(i)表示ii的约数和,由雅可比的四方定理(证明:arXiv:math/9206203),得到:
S(n)=S(2km)={8d(m)k=024d(m)k1 S(n)=S(2^km)= \begin{cases} 8d(m) & k=0\\ 24d(m) & k\geq 1 \end{cases}
其中n=2kmn=2^k mmm为奇数。

()(*)式的解的个数可以表示成x2+y2+z2+w2=4(2N+1)x^2+y^2+z^2+w^2=4(2N+1)的解的个数减去(2x)2+(2y)2+(2z)2+(2w)2=4(2N+1)(2x)^2+(2y)^2+(2z)^2+(2w)^2=4(2N+1)的解的个数并除去奇偶性和正负号的影响,即
S(4(2N+1))S(2N+1)16=d(2N+1) \frac{S(4(2N+1))-S(2N+1)}{16}=d(2N+1)
O(n)O(\sqrt{n})d(2N+1)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;
}