CF933D A Creative Cutout

Link
考虑点\((x,y)\)的贡献,设\(k=x^2+y^2\),那么贡献为:

\[\begin{aligned} &\sum\limits_{i=k}^n\sum\limits_{j=k}^ij\\ =&\sum\limits_{i=k}^n{i+1\choose 2}-{k\choose 2}\\ =&{n+2\choose 3}-{k\choose 3}-(n-k-1){k\choose 2} \end{aligned} \]

枚举\(x\),首先可以得到\(y\)的取值范围。
同时我们知道\(k\)是一个关于\(y\)的二次多项式,因此贡献是关于\(y\)的六次多项式,再套上一个\(\sum\)就是七次多项式。
预处理幂和即可\(O(1)\)计算,总时间复杂度为\(O(\sqrt n)\)

#include<cmath>
#include<cstdio>
using i64=long long;
const int N=1000007,P=1000000007;
i64 n,m,md,a[N],b[N],c[N],ans;
int main()
{
    scanf("%lld",&n),m=ceil(sqrt(n)+1e-8)-1,md=n%P;
    for(i64 i=1,t;i<=m;++i) t=i*i%P,a[i]=(a[i-1]+t)%P,b[i]=(b[i-1]+t*t)%P,c[i]=(c[i-1]+t*t%P*t)%P;
    for(i64 i=1,j=m,k;i<=m;++i)
    {
	for(;i*i+j*j>n;--j);
	k=i*i%P,ans=(ans+(1+md-k)*(2+md-k)%P*(md+k+k)%P*(j+1)+(4+3*md-12*k%P-6*md*k%P+6*k*k+P+P)%P*a[j]+(6*k-3*md%P-6+P+P)%P*b[j]+2*c[j])%P;
    }
    ans=2*((P+1)/3)*ans%P,ans=(ans+md*(md+1)%P*(md+2)%P*((P+1)/6))%P,printf("%lld",ans);
}
posted @ 2020-05-03 22:11  Shiina_Mashiro  阅读(223)  评论(0编辑  收藏  举报