首页 > 其他分享 >[ZJOI2014] 力 题解

[ZJOI2014] 力 题解

时间:2025-01-18 14:59:19浏览次数:1  
标签:frac 题解 sum ZJOI2014 fg jb

容易发现:

\[E_i=\sum_{j=1}^{i-1}\frac{q_j}{(i-j)^2}-\sum_{j=i+1}^n\frac{q_j}{(i-j)^2} \]

不妨设 \(a_i=q_i,b_i=\dfrac 1{i^2}\):

\[E_i=\sum_{j=1}^{i-1}a_jb_{i-j}-\sum_{j=1}^{n-i}a_jb_{j-i} \]

发现前半部分就是多项式乘法,后半部分与 [BZOJ2194] 一致。直接 FFT 干过去即可。

时间复杂度 \(O(n\log n)\)。

#include<bits/stdc++.h>
#define stp fixed<<setprecision(3)
using namespace std;
const int N=3e5+5;
const double pi=acos(-1);
struct comn{double a,b;};
struct dft{comn fg[N];}f,g,h;
int n,m,rev[N],k,mx=1;
comn operator+(comn x,comn y){
    return {x.a+y.a,x.b+y.b};
}comn operator-(comn x,comn y){
    return {x.a-y.a,x.b-y.b};
}comn operator*(comn x,comn y){
    return {x.a*y.a-x.b*y.b,x.b*y.a+x.a*y.b};
}void operator+=(comn &x,comn y){x=x+y;}
void operator*=(comn &x,comn y){x=x*y;}
void init(){
    for(int i=0;i<mx;i++)
        rev[i]=(rev[i>>1]>>1)|((i&1)<<(k-1));
    cout<<"";
}void fft(comn *a,int n,int fl){
    for(int i=0;i<n;i++)
        if(i<rev[i]) swap(a[i],a[rev[i]]);
    comn om={cos(pi),fl*sin(pi)},w={1,0};
    for(int i=1;i<n;i*=2,om={cos(pi/i),fl*sin(pi/i)})
        for(int j=0;j<n;j+=i*2,w={1,0})
            for(int l=j;l<j+i;l++){
                comn x=a[l],y=w*a[l+i];
                a[l]+=y,a[l+i]=x-y,w*=om;
            }
}int main(){
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0),cin>>n;
    while(mx<=n+n) mx*=2,k++;
    for(int i=1;i<=n;i++)
        cin>>f.fg[i].a,g.fg[i].a=1.0/i/i;
    for(int i=0;i<=n;i++)
        h.fg[n-i].a=f.fg[i].a;
    init(),fft(f.fg,mx,1);
    fft(g.fg,mx,1),fft(h.fg,mx,1);
    for(int i=0;i<mx;i++)
        f.fg[i]*=g.fg[i],g.fg[i]*=h.fg[i];
    fft(f.fg,mx,-1),fft(g.fg,mx,-1);
    for(int i=1;i<=n;i++)
        cout<<stp<<(f.fg[i].a-g.fg[n-i].a)/mx<<"\n";
    return 0;
}//fast fourier transform

标签:frac,题解,sum,ZJOI2014,fg,jb
From: https://www.cnblogs.com/chang-an-22-lyh/p/18678465/zjoi2014-li-tj

相关文章

  • 线性dp+背包问题题解
    线性dp理解递推/记忆化搜索,有很多种理解方式递归重叠子问题的记忆化搜索:像这里例如\(f[3]\)可以通过一次计算得到,保存答案,下一次直接调用即可,省去很多复杂度我们从此引出dp第一个性质:最优子结构大问题的最优解包含小问题的最优解,并且小问题的最优解可以推导出大问题的最优......
  • P1076 [NOIP2012 普及组] 寻宝 题解
    题目传送锚点在博客园食用更佳本题纯纯模拟题,甚至连大模拟都算不上。别问我是怎么知道的,问就是看那恶心的题目描述、标签和题目难度仅为黄知道的。好了,上思路。既然是大模拟,那就按照题目描述给的思路来,一层一层往上爬呗。一下是两点注意事项:输入时,可以考虑用二维数组或结构......
  • P1982 [NOIP2013 普及组] 小朋友的数字 题解
    题目传送锚点在博客园食用更佳题意有一列小朋友,他们每个人都有一个值。定义每个小朋友的特征值为祂及祂前面人值的最大子段和。又定义每个小朋友的数字为祂前面人中的一个人的特征值加本身值的最大值。。。思路把题意用人话说出来即为思路:先输入每个小朋友的值\(a_i\);再......
  • AGC008 题解
    A简要题意:花费1代价+1或取反,求把\(x\)变成\(y\)的最小代价显然的,取反最多只会用两次,且必在头尾,那么直接枚举就完了代码:#include<bits/stdc++.h>#defineintlonglong#definerep(i,l,r)for(inti=l;i<=r;i++)#defineper(i,l,r)for(inti=l;i>......
  • [BZOJ2194] 快速傅立叶之二 题解
    看名字,然后准备转化为多项式乘法。\[c_k=\sum_{i=0}^{n-k-1}a_{i+k}b_i\]将\(a\)反转,得:\[c_k=\sum_{i=0}^{n-k-1}a_{n-i-k-1}b_i\]这已经是多项式乘法的格式了,直接多项式乘法,最后对函数\(c\)的\(0\)到\(n-1\)次项倒序输出即可。时间复杂度\(O(n\logn)\)。#include......
  • Codeforces Round 997 (Div. 2) 题解(A~D 题)
    CodeforcesRound997(Div.2)题解(A~D题)A因为\(x,y<m\),所以每次必有重叠的长方形。且重叠部分长为\(m-x\),宽为\(m-y\),用总周长减去算重了的部分就行。注意处理第一个长方形的边界条件。B.FindthePermutation按照\(g_{i,j}\)的大小关系直接写cmp然后sort就......
  • 题解:CF140A New Year Table
    CF140ANewYearTable思路注意到题目中提到了大圆与小圆相切,我们可以计算由两条经过小圆周长与大圆圆心的切线组成的圆心角的度数。但是这个角度其实不好算,所以我们可以求出它一半的正弦值,也就是\(b\div(a-b)\),然后用asin函数求出其度数(以弧度为单位)。最后答案就是判断\(......
  • Desant 2 题解
    LibreOJ-3614Luogu-P9040很好的题。先不考虑区间,先想\(l=1,r=n\)的情况。考虑dp,\(f_i\)表示考虑\([l,r]\)的答案。则容易得到:\[f_i=\max\left\{f_{i-1},f_{i-k}+s_i-s_{i-k}\right\},f_0=0\]其中\(s\)为\(a\)的前缀和。这个转移本身是\(\Theta(n)\)的。遇......
  • [CF2048F] Kevin and Math Class 题解
    注意到这里有个区间的\(b_i\)最小。我们考虑每个\(b_i\)作为最小的时候各操作几次。显然每个\(b_i\)的【操作区间】更长是不劣的。于是这些个\(b_i\)是可以打成笛卡尔树,进行DP。想到这一点,DP便是不难的了。定义\(f_{i,j}\)为以\(i\)为根的子树内,最优操作后最大值......
  • 嵌入式杂谈——(问题解决三:嵌入式中的数据类型)
    列举1. 标准固定宽度整数类型这些类型定义在 <stdint.h> 头文件中,用于明确指定数据的位数,适合嵌入式系统中需要精确控制数据大小的场景。类型位数范围(有符号)范围(无符号)说明int8_t8-128到127-8位有符号整数uint8_t8-0到2558位无符号整数int16_t16-32,768到32,767-......