BZOJ 3527: [ZJOI2014]力(FFT)
题意
给出\(n\)个数\(q_i\),给出\(Fj\)的定义如下:
\]
令\(E_i=F_i/q_i\),求\(E_i\).
题解
一开始没发现求\(E_i\)... 其实题目还更容易想了...
\]
这个东西就是转换成求两个一样的东西就行了。
就是求$$sum_i=\sum \limits_{j<i} \frac{q_j}{(i-j)^2}$$.
这个就是可以转换成求一个卷积形式就行了。
注意多项式乘法格式是这样的:
\]
\]
令\(A\)与\(B\)的卷积为\(C\),则$$C_i=\sum \limits {j \le i}A_j*B{i-j}$$.
发现\(i-j\)那个形式似乎就可以满足本题的形式。
所以令\(B_i=\frac{1}{i^2}\)就行了,然后\(A_i=q_i\).
对于这个求两边卷积就行了23333
注意有的细节要处理一下,就是要清空一些数组,
注意一下下标(思维要清楚),而且也要令\(A_0=B_0=0\)。
而且之前求\(B_i\)的时候,\(i^2\)会爆long long !
代码
/**************************************************************
    Problem: 3527
    User: zjp_shadow
    Language: C++
    Result: Accepted
    Time:3688 ms
    Memory:32012 kb
****************************************************************/
#include <bits/stdc++.h>
#define For(i, l, r) for(register int i = (l), _end_ = (int)(r); i <= _end_; ++i)
#define Fordown(i, r, l) for(register int i = (r), _end_ = (int)(l); i >= _end_; --i)
#define Set(a, v) memset(a, v, sizeof(a))
using namespace std;
bool chkmin(int &a, int b) {return b < a ? a = b, 1 : 0;}
bool chkmax(int &a, int b) {return b > a ? a = b, 1 : 0;}
inline int read() {
    int x = 0, fh = 1; char ch = getchar();
    for (; !isdigit(ch); ch = getchar() ) if (ch == '-') fh = -1;
    for (; isdigit(ch); ch = getchar() ) x = (x<<1) + (x<<3) + (ch ^ '0');
    return x * fh;
}
void File() {
#ifdef zjp_shadow
    freopen ("P3527.in", "r", stdin);
    freopen ("P3527.out", "w", stdout);
#endif
}
struct Complex {
    double re, im;
};
inline Complex operator + (const Complex &lhs, const Complex &rhs) {
    return (Complex) {lhs.re + rhs.re, lhs.im + rhs.im};
}
inline Complex operator - (const Complex &lhs, const Complex &rhs) {
    return (Complex) {lhs.re - rhs.re, lhs.im - rhs.im};
}
inline Complex operator * (const Complex &lhs, const Complex &rhs) {
    return (Complex) {lhs.re * rhs.re - lhs.im * rhs.im, lhs.re * rhs.im + rhs.re * lhs.im};
}
const int N = 1 << 19;
int n_, n;
double f[N], g[N];
const double Pi = acos(-1.0);
int r[N];
void FFT(Complex P[], int opt) {
    For (i, 0, n - 1) if (i < r[i]) swap(P[i], P[r[i]]);
    for (int i = 2; i <= n; i <<= 1) {
        Complex Wi = (Complex) {cos(2 * Pi / i), opt * sin(2 * Pi / i)};
        int p = i / 2;
        for (int j = 0; j < n; j += i) {
            Complex x = (Complex) {1.0, 0.0};
            For (k, 0, p - 1) {
                Complex u = P[j + k], v = x * P[j + k + p];
                P[j + k] = u + v;
                P[j + k + p] = u - v;
                x = x * Wi;
            }
        }
    }
}
int m;
void Mult(Complex a[], Complex b[]) {
    int cnt = 0;
    for (n = 1; n <= m; n <<= 1) ++ cnt;
    For (i, 1, n - 1)
        r[i] = (r[i >> 1] >> 1) | ((i & 1) << (cnt - 1) );
    FFT(a, 1); FFT(b, 1);
    For (i, 0, n - 1) a[i] = a[i] * b[i];
    FFT(a, -1);
    For (i, 0, n - 1) a[i].re = a[i].re / n;
}
double ans[N];
Complex a[N], b[N];
int main () {
    //int n1 = read(), n2 = read(),
    File();
    n_ = read();
    m = n_ + n_;
    For (i, 1, n_) {
        scanf("%lf", &f[i]);
        g[i] = (double)1.0 / ((long long)i * (long long)i);
    }
    For (i, 0, n_) a[i].re = f[i], a[i].im = 0;
    For (i, 0, n_) b[i].re = g[i], b[i].im = 0;
    Mult(a, b);
    For (i, 1, n_)
        ans[i] += a[i].re;
    reverse(f + 1, f + 1 + n_);
    For (i, 0, n - 1) a[i].re = f[i], a[i].im = 0;
    For (i, 0, n - 1) b[i].re = g[i], b[i].im = 0;
    Mult(a, b);
    For (i, 1, n_)
        ans[n_ - i + 1] -= a[i].re;
    For (i, 1, n_)
        printf ("%.4lf\n", ans[i]);
    return 0;
}
												
											BZOJ 3527: [ZJOI2014]力(FFT)的更多相关文章
- bzoj 3527 [Zjoi2014]力——FFT
		
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3527 把 q[ i ] 除掉.设 g[ i ] = i^2 ,有一半的式子就变成卷积了:另一 ...
 - bzoj 3527 [Zjoi2014] 力 —— FFT
		
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3527 看了看TJ才推出来式子,还是不够熟练啊: TJ:https://blog.csdn.n ...
 - BZOJ 3527: [Zjoi2014]力(FFT)
		
我们看一下这个函数,很容易就把他化为 E=sigma(aj/(i-j)/(i-j))(i>j)-sigma(aj/(i-j)/(i-j))(j>i) 把它拆成两半,可以发现分子与分母下标相 ...
 - BZOJ 3527 [Zjoi2014]力 ——FFT
		
[题目分析] FFT,构造数列进行卷积,挺裸的一道题目诶. 还是写起来并不顺手,再练. [代码] #include <cmath> #include <cstdio> #inc ...
 - 【BZOJ】3527: [Zjoi2014]力 FFT
		
[参考]「ZJOI2014」力 - FFT by menci [算法]FFT处理卷积 [题解]将式子代入后,化为Ej=Aj-Bj. Aj=Σqi*[1/(i-j)^2],i=1~j-1. 令f(i)= ...
 - ●BZOJ 3527 [Zjoi2014]力
		
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=3527 题解: FFT求卷积. $$\begin{aligned}E_i&=\frac ...
 - 数学(FFT):BZOJ 3527 [Zjoi2014]力
		
题目在这里:http://wenku.baidu.com/link?url=X4j8NM14MMYo8Q7uPE7-7GjO2_TXnMFA2azEbBh4pDf7HCENM3-hPEl4mzoe2w ...
 - bzoj 3527: [Zjoi2014]力 快速傅里叶变换 FFT
		
题目大意: 给出n个数\(q_i\)定义 \[f_i = \sum_{i<j}{\frac{q_iq_j}{(i-j)^2}} - \sum_{i>j}\frac{q_iq_j}{(i-j ...
 - bzoj 3527: [Zjoi2014]力【FFT】
		
大力推公式,目标是转成卷积形式:\( C_i=\sum_{j=1}^{i}a_jb_{i-j} \) 首先下标从0开始存,n-- \[ F_i=\frac{\sum_{j<i}\frac{q_j ...
 
随机推荐
- c++类的基础
			
1.抽象: 抽象出公有特性,包括公有动作,公有数据. 2.类:类是具有相同属性和行为的一组对象的集合(变量和函数) 声明格式: class 类名(Dog) { 类体:(数据和函数成员)默认为私有成员, ...
 - Hive metastore源码阅读(一)
			
不要问我为什么,因为爱,哈哈哈哈...进入正题,最近做项目顺带学习了下hive metastore的源码,进行下知识总结. hive metastore的整体架构如图: 一.组成结构: 如图我们可以看 ...
 - 七、Selenium与phantomJS----------动态页面模拟点击、网站模拟登录
			
每天一个小实例1(动态页面模拟点击,并爬取你想搜索的职位信息) from selenium import webdriver from bs4 import BeautifulSoup # 调用环境变 ...
 - mac给文件批量添加后缀名
			
for i in *;do mv "$i" "$i.mp4";done
 - mysql sql_cache缓存使用
			
有如下规则,如果数据表被更改,那么和这个数据表相关的全部Cache全部都会无效,并删除之.这里"数据表更改"包括: INSERT, UPDATE, DELETE, TRUNCATE ...
 - Android硬件编解码与软件编解码
			
最近做了一个android项目用到编解码功能.大概需求是:通过摄像头拍摄一段视频,然后抽帧,生成一个短视频,以及倒序视频,刚开始直接用 H.264 编码格式,没有使用MP4容器封装.做了 ...
 - web基础知识通信概述URI与http
			
1.url是什么,有什么作用: 说白了就是我们常说的网址:正规来说就是统一资源定位符是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址. 互联网上的每个文件都有一个 ...
 - maven 在pom文件下配置默认的jdk版本
			
在pom.xml中加入这段代码就可以了 <!-- 设置默认的jdk --> <profiles> <profile> <id>jdk1.7</id ...
 - mac中的myeclipse的控制台中文乱码问题解决办法
			
之前写java用到控制台的主要是字符和数字,中文输入貌似真的还没用过,所以就遇到了一个悲剧的老问题,估计每个程序员都会遇到——中文乱码. 用的是MyEclipse开发环境,Window->Gen ...
 - openstack-ocata-仪表盘服务6
			
Dashboard(horizon)是一个web接口,使得云平台管理员以及用户可以管理不同的Openstack资源以及服务.这个部署示例使用的是 Apache Web 服务器.一. 安装和配置 接下来 ...