codeforces 933D A Creative Cutout

题目链接

 

正解:组合数学。

充满套路与细节的一道题。。

首先我们显然要考虑每个点的贡献(我就不信你能把$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 }

 

posted @ 2018-04-06 19:12  wfj_2048  阅读(553)  评论(0编辑  收藏  举报