正解:组合数学。
充满套路与细节的一道题。。
首先我们显然要考虑每个点的贡献(我就不信你能把$f$给筛出来
那么对于一个点$(x,y)$,我们设$L=x^{2}+y^{2}$,那么它的贡献就是$ans=\sum_{k=L}^{n}\sum_{j=L}^{k}j$
然后我们把后面那个$\sum$化成组合数的形式,即$ans=\sum_{k=L}^{n}\binom{k+1}{2}-\binom{L}{2}$(讲真连这一步我都没想到
注意一个等式$\sum_{i=L}^{R}\binom{i}{x}=\binom{R+1}{x+1}-\binom{L}{x+1}$,这个直接用杨辉三角的递推式即可证明。
把这个等式带进去,可得$ans=\binom{n+2}{3}-\binom{L+1}{3}-(n-L+1)\binom{L}{2}$
然后暴力拆开,可得$ans=\frac{1}{6}(n(n+1)(n+2)-L(L-1)(L+1)-3(n-L+1)(L-1)L)$
然后把$L=x^{2}+y^{2}$代入,可得$6ans=n(n+1)(n+2)+2x^{6}+6x^{4}y^{2}+6x^{2}y^{4}+2y^{6}-3(n+2)(x^{4}+2x^{2}y^{2}+y^{4})+(3n+4)(x^{2}+y^{2})$
枚举$x$,那么$y$的取值范围是一个区间。所以我们预处理出二次,三次和六次的幂和,直接算即可,复杂度$O(\sqrt{n})$。
1 #include <bits/stdc++.h> 2 #define il inline 3 #define RG register 4 #define ll long long 5 #define N (1000005) 6 #define rhl (1000000007) 7 8 using namespace std; 9 10 ll sum2[N],sum4[N],sum6[N],n,m,lim,ans; 11 12 il ll qpow(RG ll a,RG ll b){ 13 RG ll ans=1; 14 while (b){ 15 if (b&1) ans=ans*a%rhl; 16 if (b>>=1) a=a*a%rhl; 17 } 18 return ans; 19 } 20 21 int main(){ 22 #ifndef ONLINE_JUDGE 23 freopen("cutout.in","r",stdin); 24 freopen("cutout.out","w",stdout); 25 #endif 26 cin>>n,m=n%rhl,lim=sqrt(n); 27 for (RG ll i=1;i<=lim;++i){ 28 sum2[i]=(sum2[i-1]+i*i)%rhl; 29 sum4[i]=(sum4[i-1]+qpow(i,4))%rhl; 30 sum6[i]=(sum6[i-1]+qpow(i,6))%rhl; 31 } 32 for (RG ll x=-lim,y,x2,x4,x6,res;x<=lim;++x){ 33 y=sqrt(n-x*x),x2=qpow(x,2),x4=qpow(x,4),x6=qpow(x,6),res=0; 34 (res+=m*(m+1)%rhl*(m+2)+2*x6-3*(m+2)*x4+(3*m+4)*x2)%=rhl; 35 (ans+=12*x4%rhl*sum2[y]+12*x2%rhl*sum4[y]+4*sum6[y])%=rhl; 36 (ans-=12*(m+2)%rhl*x2%rhl*sum2[y])%=rhl; 37 (ans-=6*(m+2)%rhl*sum4[y])%=rhl; 38 (ans+=2*(3*m+4)*sum2[y]+res*(2*y+1))%=rhl; 39 } 40 cout<<(ans+rhl)*((rhl+1)/2)%rhl*((rhl+1)/3)%rhl; return 0; 41 }