亲子网站源码,fixed wordpress,桐庐建设局网站,省建设厅网站安徽思路比较直观。设A(x)Σxai。先把只选一种的统计进去。然后考虑选两种#xff0c;这个直接A(x)自己卷起来就好了#xff0c;要去掉选同一种的情况然后除以2。现在得到了选两种的每种权值的方案数#xff0c;再把这个卷上A(x)。得到这个后考虑去重#xff0c;其中重复的就是… 思路比较直观。设A(x)Σxai。先把只选一种的统计进去。然后考虑选两种这个直接A(x)自己卷起来就好了要去掉选同一种的情况然后除以2。现在得到了选两种的每种权值的方案数再把这个卷上A(x)。得到这个后考虑去重其中重复的就是选了两个相同的和另外一个那么再把选两个相同的生成函数搞出来卷上A减掉选三个相同的。把这个东西减掉之后再除以3。说了半天也不知道在说啥总之是容斥原理很基础的应用。 有些卡精度用long double才过可能是我写丑了。 #includeiostream
#includecstdio
#includecmath
#includecstdlib
#includecstring
#includealgorithm
using namespace std;
int read()
{int x0,f1;char cgetchar();while (c0||c9) {if (c-) f-1;cgetchar();}while (c0c9) x(x1)(x3)(c^48),cgetchar();return x*f;
}
#define N 270000
#define double long double
const double PI3.14159265358979324;
struct complex
{double x,y;complex operator (const complexa) const{return (complex){xa.x,ya.y};}complex operator -(const complexa) const{return (complex){x-a.x,y-a.y};}complex operator *(const complexa) const{return (complex){x*a.x-y*a.y,x*a.yy*a.x};}
}w[N],v[N],u[N];
int n,m,t,a[N],r[N];
long long f[N];
void DFT(int n,complex *a,int p)
{for (int i0;in;i) if (ir[i]) swap(a[i],a[r[i]]);for (int i2;in;i1){complex wn(complex){cos(2*PI/i),p*sin(2*PI/i)};for (int j0;jn;ji){complex w(complex){1,0};for (int kj;kj(i1);k,ww*wn){complex xa[k],yw*a[k(i1)];a[k]xy,a[k(i1)]x-y;}}}
}
void mul(int n,complex *a,complex *b)
{for (int i0;in;i) r[i](r[i1]1)|(i1)*(n1);for (int i0;in;i) a[i].ya[i].x-b[i].x,a[i].xa[i].xb[i].x;DFT(n,a,1);for (int i0;in;i) a[i]a[i]*a[i];DFT(n,a,-1);for (int i0;in;i) a[i].xa[i].x/n/4;
}
int main()
{
#ifndef ONLINE_JUDGEfreopen(bzoj3771.in,r,stdin);freopen(bzoj3771.out,w,stdout);const char LL[]%d %I64d\n;
#elseconst char LL[]%d %lld\n;
#endifnread();for (int i1;in;i) {int xread();mmax(m,x);w[x].xv[x].xf[x]a[x]1;}t1;while (t(m1)) t1;mul(t,w,v);for (int i0;im;i) if (a[i]) w[i1].x--;for (int i0;im*2;i) f[i]w[i].x(int)(w[i].x/20.5);for (int im*21;it;i) w[i].xw[i].y0;for (int i0;im;i) v[i].xa[i],v[i].y0;for (int im1;it;i) v[i].xv[i].y0;t1;while (tm*3) t1;mul(t,w,v);for (int i0;it;i) u[i].x(i1)?0:a[i1];for (int i0;im;i) v[i].xa[i],v[i].y0;for (int im1;it;i) v[i].x0,v[i].y0;mul(t,u,v);for (int i0;im;i) if (a[i]) u[i*3].x--;for (int i0;im*3;i) f[i](long long)((w[i].x-u[i].x)/30.5);for (int i0;im*3;i)if (f[i]) printf(LL,i,f[i]);return 0;
} 转载于:https://www.cnblogs.com/Gloid/p/9451927.html