1. 程式人生 > >codeforces 933D A Creative Cutout

codeforces 933D A Creative Cutout

turn res get cin 3D pos ive 一個 define

題目鏈接

正解:組合數學。

充滿套路與細節的一道題。。

首先我們顯然要考慮每個點的貢獻(我就不信你能把$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 }

codeforces 933D A Creative Cutout