luogu P3338 [ZJOI2014]力
这题还是老套路
先列出Ei的式子 发现分子分母下标加起来是i
但是后面有个负号非常恶心(在这差点弃疗)
冷静下来点一根烟想一想完全不需要管后面的
因为两部分互不影响
注意后面是差为定值所以把下标反过来
注意最后要reverse
注意这题空间别开大了.....
Code:
1 #include<cstdio> 2 #include<cstring> 3 #include<cmath> 4 #include<algorithm> 5 #define rep(i,a,n) for(int i = a;i <= n;++i) 6 #define per(i,n,a) for(int i = n;i >= a;--i) 7 #define inf 2147483647 8 #define ms(a,b) memset(a,b,sizeof a) 9 using namespace std; 10 typedef double D; 11 typedef long long ll; 12 const D PI = acos(-1); 13 ll read() { 14 ll as = 0,fu = 1; 15 char c = getchar(); 16 while(c < '0' || c > '9') { 17 if(c == '-') fu = -1; 18 c = getchar(); 19 } 20 while(c >= '0' && c <= '9') { 21 as = as * 10 + c- '0'; 22 c = getchar(); 23 } 24 return as * fu; 25 } 26 //head 27 const int N = 1<<21; 28 struct cp { 29 D x,y; 30 cp(D X = 0,D Y = 0) {x = X,y = Y;} 31 cp operator + (const cp &o) const {return cp(x+o.x,y+o.y);} 32 cp operator - (const cp &o) const {return cp(x-o.x,y-o.y);} 33 cp operator * (const cp &o) const {return cp(x*o.x-y*o.y,x*o.y+y*o.x);} 34 } a[N],b[N],g[N]; 35 36 int r[N],lim = 1,base; 37 void fft(cp *a,int d) { 38 rep(i,0,lim-1) if(i < r[i]) swap(a[i],a[r[i]]); 39 for(int i = 1;i < lim;i <<= 1) { 40 cp T(cos(PI/i),d * sin(PI/i)); 41 for(int k = 0;k < lim;k += (i<<1)) { 42 cp t(1,0); 43 rep(l,0,i-1) { 44 cp nx = a[k+l],ny = a[k+l+i] * t; 45 a[k+l] = nx+ny,a[k+l+i] = nx-ny; 46 t = t * T; 47 } 48 } 49 } 50 } 51 int n; 52 int main() { 53 n = read(); 54 rep(i,0,n-1) { 55 scanf("%lf",&a[i].x); 56 b[n-i].x = a[i].x; 57 g[i].x = (i ? 1.0 / i / i : 0); 58 } 59 while(lim <= n << 1) lim <<= 1,base++; 60 rep(i,0,lim-1) r[i] = (r[i>>1]>>1) | ((i&1) << base-1); 61 62 fft(a,1),fft(b,1),fft(g,1); 63 rep(i,0,lim-1) a[i] = a[i] * g[i]; 64 rep(i,0,lim-1) b[i] = b[i] * g[i]; 65 fft(a,-1),fft(b,-1); 66 67 rep(i,0,n-1) printf("%.3lf\n",(a[i].x - b[n-i].x) / lim); 68 return 0; 69 }
> 别忘了 总有人在等着你