• BZOJ 3527: [Zjoi2014]力


    3527: [Zjoi2014]力

    Time Limit: 30 Sec  Memory Limit: 256 MBSec  Special Judge
    Submit: 1545  Solved: 900
    [Submit][Status][Discuss]

    Description

    给出n个数qi,给出Fj的定义如下:
    令Ei=Fi/qi,求Ei.
     

    Input

    第一行一个整数n。
    接下来n行每行输入一个数,第i行表示qi。
    n≤100000,0<qi<1000000000
     
     

    Output

     n行,第i行输出Ei。与标准答案误差不超过1e-2即可。

    Sample Input

    5
    4006373.885184
    15375036.435759
    1717456.469144
    8514941.004912
    1410681.345880

    Sample Output

    -16838672.693
    3439.793
    7509018.566
    4595686.886
    10903040.872

    HINT

     

    Source

     
    [Submit][Status][Discuss]

    额,FFT是真的不会,卷积是真的不熟,wzq_QwQ的题解是真的好。

    首先把$q_{i}$除到右边,然后上下约掉,然后,发现有规律,然后构造函数,请移步wzq_QwQ的题解吧,懒得抄了。

     1 #include <cmath>
     2 #include <cstdio>
     3 #include <iostream>
     4 
     5 const int siz = 600005;
     6 const double pi = acos(-1);
     7 
     8 inline double sqr(double x) {
     9     return x * x;
    10 }
    11 
    12 int n, rev[siz];
    13 double num[siz];
    14 
    15 struct complex
    16 {
    17     double r, i;
    18 
    19     inline complex(double a = 0, double b = 0)
    20         : r(a), i(b) {};
    21     inline complex operator + (const complex &a) {
    22         return complex(r + a.r, i + a.i);
    23     }
    24     inline complex operator - (const complex &a) {
    25         return complex(r - a.r, i - a.i);
    26     }
    27     inline complex operator * (const complex &a) {
    28         return complex(r*a.r - i*a.i, r*a.i + i*a.r);
    29     }
    30 }a[siz], b[siz];
    31 
    32 inline void FFT(complex *s, int k)
    33 {
    34     for (int i = 0; i < n; ++i)
    35         if (i < rev[i])
    36             std::swap(s[i], s[rev[i]]);
    37     
    38     for (int h = 2; h <= n; h <<= 1)
    39     {
    40         complex wn(cos(2*pi*k/h), sin(2*pi*k/h));
    41         for (int i = 0; i < n; i += h)
    42         {
    43             complex w(1, 0);
    44             for (int j = 0; j < (h >> 1); ++j, w = w*wn)
    45             {
    46                 complex t = s[i + j + (h >> 1)]*w;
    47                 s[i + j + (h >> 1)] = s[i + j] - t;
    48                 s[i + j] = s[i + j] + t;
    49             }
    50         }
    51     }
    52     
    53     if (k == -1)
    54         for (int i = 0; i < n; ++i)
    55             s[i].r = s[i].r / n;
    56 }
    57 
    58 signed main(void)
    59 {
    60     scanf("%d", &n); --n;
    61     
    62     for (int i = 0; i <= n; ++i)
    63         scanf("%lf", &a[i].r);
    64         
    65     for (int i = 0; i < n; ++i)
    66         b[i].r = -1.0 / sqr(n - i);
    67         
    68     for (int i = n + 1; i <= 2*n; ++i)
    69         b[i].r = -1.0 * b[2*n - i].r;
    70         
    71     int m = n, k = n << 2, len = 0;
    72     
    73     for (n = 1; n <= k; n <<= 1)++len;
    74     
    75     for (int i = 0; i < n; ++i)
    76         rev[i] = (rev[i >> 1] >> 1) | ((i & 1) << (len - 1));
    77         
    78     FFT(a, 1);
    79     FFT(b, 1);
    80     
    81     for (int i = 0; i <= n; ++i)
    82         a[i] = a[i] * b[i];
    83     
    84     FFT(a, -1);
    85     
    86     for (int i = m; i <= 2*m; ++i)
    87         printf("%lf
    ", a[i].r);
    88 }

    @Author: YouSiki

  • 相关阅读:
    SpringMVC防止重复提交
    Apache Lucene初探
    ORACLE触发器详解
    ORA-02287: sequence number not allowed here问题的解决
    数据库索引
    字符串 栈
    字符串 逆序
    汽水瓶
    查找 排序----有一只兔子,从出生后第3个月起每个月都生一只兔子,小兔子长到第三个月后每个月又生一只兔子,假如兔子都不死,问每个月的兔子总数为多少?
    usb串口的作用以及JLINK
  • 原文地址:https://www.cnblogs.com/yousiki/p/6266368.html
Copyright © 2020-2023  润新知