force

题意

求解 Ei = Fi/qi

解法:

方法一:

考虑左侧的式子,直接多项式乘法。

对于右面的式子,我们记做$B_j$,这样有

$$B_j = \sum_{j<i}{ revq_{n-i} f(i-j) }$$

$$B_j = \sum_{0<k<n-j}{ revq_t f(n-j-t) }$$

$$B_j = (revq \otimes f)_{n-j}$$

五次DFT变形即可。

在卡精度的情况下可以用实时用三角函数算 $wt$ 代替用 $wn$ 连乘旋转得到 $wt$。

#include <bits/stdc++.h>

#define PI acos(-1)

const int N = 100010;

using namespace std;

struct EX
{
    double real,i;
    EX operator+(const EX tmp)const{return (EX){real+tmp.real, i+tmp.i};};
    EX operator-(const EX tmp)const{return (EX){real-tmp.real, i-tmp.i};};
    EX operator*(const EX tmp)const{return (EX){real*tmp.real - i*tmp.i, real*tmp.i + i*tmp.real};};
};

int R[N<<2];

void DFT(EX a[],int n,int tp_k)
{
    for(int i=0;i<n;i++) if(i<R[i]) swap(a[i],a[R[i]]);
    for(int d=1;d<n;d<<=1)
    {
        EX wn = (EX){cos(PI/d), sin(PI/d)*tp_k};
        for(int i=0;i<n;i += (d<<1))
        {
            EX wt = (EX){1,0};    //高速度用
            for(int k=0;k<d;k++, wt = wt*wn)
            {
            //    EX wt = (EX){cos(PI*k / d) ,tp_k*sin(PI*k / d)}; //高精度用(到 10^14 的精度)
                EX A0 = a[i+k], A1 = wt * a[i+k+d];
                a[i+k] = A0+A1;
                a[i+k+d] = A0-A1;
            }
        }
    }
    if(tp_k==-1)
        for(int i=0;i<n;i++) a[i] = (EX){a[i].real/n, a[i].i/n};
}

int n,m;
EX A[N<<2],B[N<<2],C[N<<2];
double q[N],ans[N];

int main()
{
    freopen("force.in", "r", stdin);
    freopen("force.out", "w", stdout);
    scanf("%d",&n);
    for(int i=0;i<n;i++) scanf("%lf",&q[i]);
    int L = 0,tot;
    while((1<<L)<n+n-1) L++;
    tot = (1<<L);
    for(int i=1;i<tot;i++) R[i]=(R[i>>1]>>1)|((i&1)<<(L-1));

    for(int i=0;i<n;i++) A[i] = (EX){q[i], 0};
    for(int i=1;i<n;i++) B[i] = (EX){1/(double)i/(double)i, 0};
    DFT(A,tot,1);
    DFT(B,tot,1);
    for(int i=0;i<tot;i++) C[i] = A[i]*B[i];
    DFT(C,tot,-1);
    for(int i=0;i<n;i++) ans[i] += C[i].real;

    memset(A,0,sizeof(A));
    for(int i=1;i<n;i++) A[i] = (EX){q[n-i], 0};
    DFT(A,tot,1);
    for(int i=0;i<tot;i++) C[i] = A[i]*B[i];
    DFT(C,tot,-1);
    for(int i=0;i<n;i++) ans[i] -= C[n-i].real;

    for(int i=0;i<n;i++) printf("%.3lf\n",ans[i]);
    return 0;
}

方法二:

考虑拓展

$$C_{j+n} = \sum_{0 \leq k \leq j+n} { q_k A_{j+n-k} }$$

其中

$A_i = \frac{1}{(i-n)^2} (n < i < 2n)$

$A_i = \frac{1}{(n-i)^2} (0 < i < n)$

从而有 $B_j = C_{j+n}$

其他全为0,这样一次FFT卷积得到答案

#include <bits/stdc++.h>

#define PI acos(-1)

const int N = 100010;

using namespace std;

struct EX
{
    double real,i;
    EX operator+(const EX tmp)const{return (EX){real+tmp.real, i+tmp.i};};
    EX operator-(const EX tmp)const{return (EX){real-tmp.real, i-tmp.i};};
    EX operator*(const EX tmp)const{return (EX){real*tmp.real - i*tmp.i, real*tmp.i + i*tmp.real};};
};

int R[N<<3];

void DFT(EX a[],int n,int tp_k)
{
    for(int i=0;i<n;i++) if(i<R[i]) swap(a[i],a[R[i]]);
    for(int d=1;d<n;d<<=1)
    {
        EX wn = (EX){cos(PI/d), sin(PI/d)*tp_k};
        for(int i=0;i<n;i += (d<<1))
        {
            EX wt = (EX){1,0};    //高速度用
            for(int k=0;k<d;k++, wt = wt*wn)
            {
            //    EX wt = (EX){cos(PI*k / d) ,tp_k*sin(PI*k / d)}; //高精度用(到 10^14 的精度)
                EX A0 = a[i+k], A1 = wt * a[i+k+d];
                a[i+k] = A0+A1;
                a[i+k+d] = A0-A1;
            }
        }
    }
    if(tp_k==-1)
        for(int i=0;i<n;i++) a[i] = (EX){a[i].real/n, a[i].i/n};
}

int n,m;
EX A[N<<3],B[N<<3],C[N<<3];
double q[N],ans[N];

int main()
{
    freopen("force.in", "r", stdin);
    freopen("force.out", "w", stdout);
    scanf("%d",&n);
    for(int i=0;i<n;i++) scanf("%lf",&q[i]);
    int L = 0,tot;
    while((1<<L)<4*n-1) L++;
    tot = (1<<L);
    for(int i=1;i<tot;i++) R[i]=(R[i>>1]>>1)|((i&1)<<(L-1));

    for(int i=0;i<n;i++) A[i] = (EX){q[i], 0};
    for(int i=1;i<n;i++)
    {
        B[i] = (EX){-1/(double)(n-i)/(double)(n-i), 0};
        B[i+n] = (EX){1/(double)i/(double)i, 0};
    }
    DFT(A,tot,1);
    DFT(B,tot,1);
    for(int i=0;i<tot;i++) C[i] = A[i]*B[i];
    DFT(C,tot,-1);
    for(int i=0;i<n;i++) ans[i] = C[i+n].real;
    for(int i=0;i<n;i++) printf("%.3lf\n",ans[i]);
    return 0;
}

时间: 2024-11-19 23:56:28

force的相关文章

&lt;BEA-000388&gt; &lt;JVM called WLS shutdown hook. The server will force shutdown now&gt;

在生产weblogic部署环境,发现weblogic每隔几个小时就shutdown一次,经过跟踪发现既不是内存问题,也不是数据库连接池问题,更不是访问量过大引起. 查询相关日志,只有以下几句shutdown的日志: <BEA-000388> <JVM called WLS shutdown hook. The server will force shutdown now> <BEA-000396> <Server shutdown has been request

mysql force index() 强制索引的使用

mysql force index() 强制索引的使用 之前跑了一个SQL,由于其中一个表的数据量比较大,而在条件中有破坏索引或使用了很多其他索引,就会使得sql跑的非常慢... 那我们怎么解决呢? 这时候我么可以使用mysql force index() 强制索引来优化查询语句: 使用MySQL force index 强制索引的目的是对目标表添加最关键的索引,使其优先使用该索引筛选数据: select * from ws_shop a where date(create_time-inter

【Unity】11.6 恒定力 (Constant Force)

分类:Unity.C#.VS2015 创建日期:2016-05-02 一.简介 恒定力 (Constant Force) 是用于向刚体 (Rigidbody) 添加恒定力的快速实用工具,适用于类似火箭等发射出来的对象,这些对象在起初并没有很大的速度但却是在不断加速. 如果您不希望单次发射对象(如火箭)以较大速率启动而是希望缓慢地进行加速,则这十分适用于这类对象. 下图是由恒定力 (Constant Force) 向前推动的火箭: 二.相关属性 1.Force (力) 在世界坐标空间中应用的力的向

[其它]dell戴尔机型出现asf2 force off 问题可能原因及解决方法

  我的 venue 11 突然无缘无故强制关机,查看bios日志,发现非正常关机记录,显示为asf2 force off ,查了下百度,囧....内容还真少,于是就转向谷歌,发现国外网友有大量关于此问题的求助帖,但翻了半天也没找到解决方法. 我想既然问题这么普遍,不应该是硬件问题啊,否则dell工程师天天白吃米饭了? 后来看到有人说自己的平板之前返厂换过显卡,显卡型号被换了,但驱动还是从官网下的旧型号驱动,所以一直出现这个问题而没有察觉到原因,直到安装了显卡厂家提供的驱动才完美解决. 所以我就

Android Force Close和ANR等异常处理方法

对android应用而言最常出现的异常是Force close和ANR(Application is not response). 对于这两类错误而言,应用是可以进行相关处理的. 一 Forceclose这类问题主要通过Thread.UncaughtExceptionHandler这个类来捕获异常.通过实现类里面的方法uncaughtException来实现应用在捕获到异常后进行相关的处理.一般这里处理基本放在应用的Application类中.为了方便大家进行相关处理,我这里写了个类,大家直接在

hdoj 4971 A simple brute force problem. 【最大闭合权 --&gt; 最小割】

题目:hdoj 4971 A simple brute force problem. 题意:给出 n 个任务和 m 项技术,完成某个任务需要其中几项技术,完成某个任务有奖金,学习某个技术需要钱,技术之间有父子关系,某项技术可能需要先学习其他技术,然后问你选择做那些任务获得收益最大? 分析:看题意的黑体字部分,就是一个标准的闭合权问题,这个题目的关键忽悠点在于技术之间的关系,导致很多人想到了dp以及树形dp. 其实就是一个闭合权问题模板,官方题解说如果技术之间存在相互的关系需要缩点,其实不用缩点也

HDU 4971 A simple brute force problem.(dp)

HDU 4971 A simple brute force problem. 题目链接 官方题解写的正解是最大闭合权,但是比赛的时候用状态压缩的dp也过掉了- -,还跑得挺快 思路:先利用dfs预处理出每个项目要完成的技术集合,那么dp[i][j]表示第i个项目,已经完成了j集合的技术,由于j这维很大,所以利用map去开数组 代码: #include <cstdio> #include <cstring> #include <algorithm> #include &l

【最小割】HDU 4971 A simple brute force problem.

说是最大权闭合图.... 比赛时没敢写.... 题意 一共有n个任务,m个技术 完成一个任务可盈利一些钱,学习一个技术要花费钱 完成某个任务前需要先学习某几个技术 但是可能在学习一个任务前需要学习另几个任务 求最多能赚多少钱咯 先将缩点将需要一起学掉的技术缩成一个点 建s--任务 权值为该任务盈利多少钱 建技术(缩点后)-t 权值为学习这技术的花费(总) 任务-技术 (完成该任务所需的每个技术都需要建边)权值为INF #include<stdio.h> #include<stdlib.h

Force.com - 微信接口后台开发与配置

为寻找国内免费云资源作为微信后台,花了一天时间试用SinaAppEngine(SAE),调试太不方便用户体验差.新浪作为媒体公司技术功底经不起考验,亚马逊能推出AWS,新浪还不行!更好选项是百度BaiduAppEngine(BAE),但最近尽然开始收费,还是安心回到force.com,至少老外承诺免费的东西一直免费且可靠. 第一步,申请force.com账号,请至developer.force.com申请,如是www.salesforce.com申请下来的是作为客户的账号,不适合开发人员:第二步

Force.com微信企业号开发系列(一) - 启用二次验证

微信于9月份推出企业号后引起了业界不小的反响,许多企业都在思索企业号将如何影响企业的运营,从本文开始,我将详细阐述微信企业号开发的相关知识,而本文将着重介绍如何实现更高安全机制的二次验证. 申请企业体验号: 企业号顾名思义就是企业来申请的号,申请时就像申请服务号一样,需要提供各种组织证明文件,对广大开发者来说很难操作,好在腾讯公司也像服务号一样开通了体验号申请,留意企业体验号的有效期间非常短,只有90天(服务号测试账号有1年有效期),且如果企业体验号长期不使用还会收到腾讯公司的提前失效提醒邮件.