【JZOJ3617】【ZJOI2014】力
╰( ̄▽ ̄)╭
对于100%的数据,n≤100000;0<qi<1,000,000,000。
(⊙ ▽ ⊙)
令ri=1i2,
设Fj=∑j−1i=0qi∗rj−1−i,Gj=∑j−1i=0qn−1−i∗rj−i−1。
显然Ei=Fi−Gn−i−1。
像F,G的这样的式子,我称它为卷积式:
当满足
这样的形式时,可以利用快速傅里叶变换:
设多项式A的系数分别为a[0],a[1],a[2],...,a[j−1],
多项式B的系数分别为b[0],b[1],b[2],...,b[j−1]。
则多项式C(其中C=A∗B)的系数就分别为f[0],f[1],f[2],...,f[j−1]。
( ̄~ ̄)
#include<iostream>
#include<algorithm>
#include<stdio.h>
#include<math.h>
#include<string.h>
#define ll long long
using namespace std;
const char* fin="ex3617.in";
const char* fout="ex3617.out";
const int inf=0x7fffffff;
const int maxn=500007;
const double pi=acos(-1);
struct Z{
double x,y;
Z(double _x=0,double _y=0){x=_x;y=_y;}
Z operator +(const Z &a){return Z(x+a.x,y+a.y);}
Z operator -(const Z &a){return Z(x-a.x,y-a.y);}
Z operator *(const Z &a){return Z(x*a.x-y*a.y,x*a.y+y*a.x);}
}a[maxn],b[maxn],c[maxn],d[maxn];
int n,m,i,j,k,r[maxn];
void fft(Z *a,int sig){
int i,j,k;
for (i=0;i<n;i++) if (r[i]<i) swap(a[r[i]],a[i]);
for (i=2;i<=n;i<<=1){
int ha=i/2;
for (j=0;j<ha;j++){
Z w(cos(j*pi*sig/ha),sin(j*pi*sig/ha));
for (k=j;k<n;k+=i){
Z u=a[k],v=w*a[k+ha];
a[k]=u+v;
a[k+ha]=u-v;
}
}
}
}
int main(){
scanf("%d",&n);
for (i=0;i<n;i++){
scanf("%lf",&a[i].x);
c[n-1-i].x=a[i].x;
}
for (i=1;i<n;i++) b[i]=1.0/i/i;
m=n;
k=0;
for (n=1;n<m<<1;n<<=1) k++;
for (i=0;i<n;i++) r[i]=(r[i>>1]>>1)|((i&1)<<(k-1));
fft(a,1);
fft(c,1);
fft(b,1);
for (i=0;i<n;i++) a[i]=a[i]*b[i];
for (i=0;i<n;i++) c[i]=c[i]*b[i];
fft(a,-1);
fft(c,-1);
for (i=0;i<m;i++) printf("%lf\n",a[i].x/n-c[m-i-1].x/n);
return 0;
}
(⊙v⊙)
1.
for (i=0;i<n;i++) r[i]=(r[i>>1]>>1)|((i&1)<<(k-1));
这是一行很强的代码,可以用于求出:二进制数i在k位意义上的倒转r[i]
具体地,
采用递推的形式,r[i]可由r[i shr 1]推得。
实质是i和i shr 1在二进制中十分相似,区别只在于i多了一位数。
2.WARNING
最后的结果一定要/n!
【JZOJ3617】【ZJOI2014】力的更多相关文章
- [ZJOI3527][Zjoi2014]力
[ZJOI3527][Zjoi2014]力 试题描述 给出n个数qi,给出Fj的定义如下: 令Ei=Fi/qi.试求Ei. 输入 包含一个整数n,接下来n行每行输入一个数,第i行表示qi. 输出 有n ...
- bzoj3527: [Zjoi2014]力 fft
bzoj3527: [Zjoi2014]力 fft 链接 bzoj 思路 但是我们求得是 \(\sum\limits _{i<j} \frac{q_i}{(i-j)^2}-\sum_{i> ...
- 洛谷 P3338 [ZJOI2014]力 解题报告
P3338 [ZJOI2014]力 题目描述 给出n个数qi,给出Fj的定义如下: \(F_j = \sum_{i<j}\frac{q_i q_j}{(i-j)^2 }-\sum_{i>j ...
- 【BZOJ 3527】 3527: [Zjoi2014]力 (FFT)
3527: [Zjoi2014]力 Time Limit: 30 Sec Memory Limit: 256 MBSec Special JudgeSubmit: 2003 Solved: 11 ...
- [洛谷P3338] [ZJOI2014]力
洛谷题目链接:P3338 [ZJOI2014]力 题目描述 给出n个数qi,给出Fj的定义如下: \[F_j = \sum_{i<j}\frac{q_i q_j}{(i-j)^2 }-\sum_ ...
- P3338 [ZJOI2014]力(FFT)
题目 P3338 [ZJOI2014]力 做法 普通卷积形式为:\(c_k=\sum\limits_{i=1}^ka_ib_{k-i}\) 其实一般我们都是用\(i=0\)开始的,但这题比较特殊,忽略 ...
- [Luogu P3338] [ZJOI2014]力 (数论 FFT 卷积)
题面 传送门: 洛咕 BZOJ Solution 写到脑壳疼,我好菜啊 我们来颓柿子吧 \(F_j=\sum_{i<j}\frac{q_i*q_j}{(i-j)^2}-\sum_{i>j} ...
- 笔记-[ZJOI2014]力
[ZJOI2014]力 \[\begin{split} E_j=&\sum_{i=1}^{j-1}\frac{q_i}{(i-j)^2}-\sum_{i=j+1}^{n}\frac{q_i}{ ...
- 【BZOJ】3527: [Zjoi2014]力 FFT
[参考]「ZJOI2014」力 - FFT by menci [算法]FFT处理卷积 [题解]将式子代入后,化为Ej=Aj-Bj. Aj=Σqi*[1/(i-j)^2],i=1~j-1. 令f(i)= ...
- [bzoj3527][Zjoi2014]力_FFT
力 bzoj-3527 Zjoi-2014 题目大意:给定长度为$n$的$q$序列,定义$F_i=\sum\limits_{i<j}\frac{q_iq_j}{(i-j)^2}-\sum\lim ...
随机推荐
- 11_数据降维PCA
1.sklearn降维API:sklearn. decomposition 2.PCA是什么:主成分分析 本质:PCA是一种分析.简化数据集的技术. 目的:是数据维数压缩,尽可能降低原数据的维数(复杂 ...
- js 属性的遍历
引自:http://es6.ruanyifeng.com/#docs/object 属性的遍历 ES6 一共有5种方法可以遍历对象的属性. (1)for...in for...in循环遍历对象自身的和 ...
- Activiti数据库
数据库 Activiti的后台是有数据库的支持,所有的表都以ACT_开头. 第二部分是表示表的用途的两个字母标识. 用途也和服务的API对应. 1) ACT_RE_*: 'RE'表示repos ...
- Sqoop学习笔记_Sqoop的基本使用二(sqoop的import与export)
Sqoop抽取从mysql抽取到hive sqoop抽取到mysql一样有两种方式一种是用command line的方式,一种是用sqoop opt文件调用的方式.(由于两种sqoop一已经记录了,现 ...
- lc13 Roman to Integer
lc13 Roman to Integer 遇到那六种特殊情况分别-2,-20,-200, 按照罗马数字的规则,每种只可能出现一次.所以只需要考虑一次,用indexOf()即可判断是否出现这几种特殊情 ...
- http和tcp/ip,socket的区别
http协议和tcp/ip协议乍看起来,感觉是同一类的东西,其实不然,下面简单的说说他们的区别. http协议是应用层的一种数据封装协议,类似的还有ftp,telnet等等,而tcp/ip是数据传输层 ...
- Spring注解驱动开发(四)-----aop、声明式事务
AOP 概念 指在程序运行期间动态的将某段代码切入到指定方法指定位置进行运行的编程方式:-----基于动态代理 一个aop示例 1.导入aop模块:Spring AOP:(spring-aspects ...
- BottomNavigationView(底部导航)
BottomNavigationView 很早之前就在 Material Design 中出现了,但是直到 Android Support Library 25 中才增加了 BottomNavigat ...
- phpStrom编辑器 通过 git 提交代码到 gitlab
前提: 1.已经成功安装 git: 2.将 phpstrom 和 gitlab 连接起来.参考此文章 一.在 phpstrom 中打开需要推送的项目 二.将 ‘工作区’ 代码 添加到 ‘暂存区’ 三. ...
- centos7下python3和pycharm安装
1.python3安装 直接到官网下载或在以下地址下载让后解压安装 下载地址:https://www.python.org/ftp/python/ 安装参考博客:https://www.cnblogs ...