zoukankan      html  css  js  c++  java
  • 力[ZJOI2014]

    【题目描述】

    给出 (n) 个数 (q_1,q_2, dots q_n),定义

    (F_j~=~sumlimits_{i = 1}^{j - 1} frac{q_i imes q_j}{(i - j)^2}~-~sumlimits_{i = j + 1}^{n} frac{q_i imes q_j}{(i - j)^2})

    (E_i~=~frac{F_i}{q_i})

    对 $1 leq i leq n$,求 (E_i) 的值。

    【输入格式】

    第一行输入一个整数 (n)

    以下 (n) 行,每行有一个实数。第 (i+1) 行的数代表 (q_i)

    【输出格式】

    输出 (n) 行每行一个实数,第 (i) 行的数字代表 (E_i)

    当你的输出与标准答案相差不超过 $10^{-2}$ 即为正确。

    题解

    (E_i=frac{F_i}{q_i}) 上下都有$q_i$ 直接扔掉即可

    (E_i=sumlimits_{j = 1}^{i - 1} frac{q_j}{(i - j)^2}~-~sumlimits_{j = i + 1}^{n} frac{q_j}{(i - j)^2})

    (E_i=sumlimits_{j = 1}^{i} frac{q_j}{(i - j)^2}~-~sumlimits_{j = i}^{n} frac{q_j}{(i - j)^2})

    令$f[j]=q[j],~g[j]=frac{1}{j^2}$,特殊地,(f[0]=g[0]=0)

    (E_i=sumlimits_{j = 0}^{i} f[j]*g[i-j]~-~sumlimits_{j = i}^{n} f[j]*g[j-i])

    (E_i=sumlimits_{j = 0}^{i} f[j]*g[i-j]~-~sumlimits_{j = 0}^{n-i} f[j+i]*g[j])

    令$h[j]=f[n-j]$,

    (E_i=sumlimits_{j = 0}^{i} f[j]*g[i-j]~-~sumlimits_{j = 0}^{n-i} h[(n-i)-j]*g[j])

    这样两个$sum$都是卷积形式了 FFT乱搞即可

    注意细节和精度。。。

    代码

    #include <bits/stdc++.h>
    using namespace std;
    
    const double pi = acos(-1.0);
    int n, m, lim, l, rev[1000005];
    
    struct comp {
        double x,y;
        comp(double xx = 0, double yy = 0): x(xx), y(yy) {}
    } a[1000005], b[1000005], cc[1000005];
    
    inline comp operator + (comp p, comp q) { return comp(p.x+q.x , p.y+q.y); }
    inline comp operator - (comp p, comp q) { return comp(p.x-q.x , p.y-q.y); }
    inline comp operator * (comp p, comp q) { return comp(p.x*q.x-p.y*q.y , p.x*q.y+p.y*q.x); }
    
    void FFT(comp *c, int tp) {
    	for (int i = 0; i < lim; i++) {
    		if (i < rev[i]) swap(c[i], c[rev[i]]);
    	}
    	for (int mid = 1; mid < lim; mid <<= 1) {
    		comp wn = comp(cos(pi / mid), sin(pi / mid) * tp);
    		for (int r = mid<<1, j = 0; j < lim; j += r) {
    			comp w = comp(1, 0);
    			for (int k = 0; k < mid; k++, w = w * wn) {
    				comp x = c[j+k], y = w * c[j+k+mid];
    				c[j+k] = x + y;
    				c[j+k+mid] = x - y;
    			}
    		}
    	}
    }
    
    int main() {
    	scanf("%d", &n);
    	for (int i = 1; i <= n; i++) {
    		scanf("%lf", &a[i].x);
    		cc[n-i].x = a[i].x;
    		b[i].x = (double)(1.0 / i / i);
    	} 
    	lim = 1;
    	while (lim <= n + n) {
    		lim <<= 1;
    		l++;
    	} 
    	for (int i = 0; i < lim; i++) {
    		rev[i] = (rev[i>>1]>>1)|((i&1)<<(l-1));
    	}
    	FFT(a, 1); FFT(b, 1); FFT(cc, 1);
    	for (int i = 0; i < lim; i++) {
    		a[i] = a[i] * b[i];
    		cc[i] = cc[i] * b[i];
    	}
    	FFT(a, -1); FFT(cc, -1);
    	for (int i = 0; i < lim; i++) {
    		a[i].x /= lim; cc[i].x /= lim;
    	}
    	for (int i = 1; i <= n; i++) {
    		printf("%.3lf
    ", a[i].x - cc[n-i].x);	
    	}
    	return 0;
    } 
    
  • 相关阅读:
    【转】win8.1下安装ubuntu
    Codeforces 1025G Company Acquisitions (概率期望)
    Codeforces 997D Cycles in Product (点分治、DP计数)
    Codeforces 997E Good Subsegments (线段树)
    Codeforces 1188E Problem from Red Panda (计数)
    Codeforces 1284E New Year and Castle Building (计算几何)
    Codeforces 1322D Reality Show (DP)
    AtCoder AGC043C Giant Graph (图论、SG函数、FWT)
    Codeforces 1305F Kuroni and the Punishment (随机化)
    AtCoder AGC022E Median Replace (字符串、自动机、贪心、计数)
  • 原文地址:https://www.cnblogs.com/ak-dream/p/AK_DREAM69.html
Copyright © 2011-2022 走看看