• 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
    ",(a[i].x - b[n-i].x) / lim);
    68     return 0;
    69 }
  • 相关阅读:
    没有服务商如何购买ERP的序列号?
    智能ERP主副机设置
    银盒子·序列号购买(2018-12-05)
    简易付微信收款提示支付失败
    简易付无法登录的解决方案
    Orchard详解--第八篇 拓展模块及引用的预处理
    Orchard详解--第七篇 拓展模块(译)
    Orchard详解--第六篇 CacheManager 2
    Orchard详解--第五篇 CacheManager
    Orchard详解--第四篇 缓存介绍
  • 原文地址:https://www.cnblogs.com/yuyanjiaB/p/10120506.html
Copyright © 2020-2023  润新知