bzoj 3527 [Zjoi2014]力

本文针对ZJOI2014中的一道力问题进行详细解析,给出了具体的实现代码,并强调了在处理过程中保持变量类型为double的重要性以避免精度损失。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

3527: [Zjoi2014]力

Time Limit: 30 Sec   Memory Limit: 256 MBSec   Special Judge
Submit: 2126   Solved: 1261
[ Submit][ Status][ Discuss]

Description

给出n个数qi,给出Fj的定义如下:
令Ei=Fi/qi,求Ei.

Input

第一行一个整数n。
接下来n行每行输入一个数,第i行表示qi。
n≤100000,0<qi<1000000000

Output

 n行,第i行输出Ei。与标准答案误差不超过1e-2即可。

Sample Input

5
4006373.885184
15375036.435759
1717456.469144
8514941.004912
1410681.345880

Sample Output

-16838672.693
3439.793
7509018.566
4595686.886
10903040.872





【分析】

http://blog.youkuaiyun.com/wzq_qwq/article/details/48155921


看了题解自己码了一发...精度爆炸

b[i].r=(-1.0)/((double)(n-i)*(double)(n-i));
一定要注意所有变量都变成double型的...(被这东西卡了一晚上)



【代码】

//bzoj 3527 [Zjoi2014]力
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define pi acos(-1)
#define ll long long
#define M(a) memset(a,0,sizeof a)
#define fo(i,j,k) for(int i=j;i<=k;i++)
using namespace std;
const int mxn=800005;
int n,m,L,N,M;
int R[mxn],ans[mxn];
struct E
{
    double r,f;
    E (double u,double v) {r=u,f=v;}
    E () {}
    E operator + (E u) {return E(r+u.r,f+u.f);}
    E operator - (E u) {return E(r-u.r,f-u.f);}
    E operator * (E u) {return E(r*u.r-f*u.f,r*u.f+f*u.r);}
    E operator / (int v) {return E(r/v,f/v);}
}a[mxn],b[mxn],c[mxn];
inline void fft(E *a,int f)
{
    fo(i,0,n-1) if(i<R[i]) swap(a[i],a[R[i]]);
    for(int i=1;i<n;i<<=1)
    {
        E wn(cos(pi/i),f*sin(pi/i));
        for(int j=0;j<n;j+=(i<<1))
        {
            E w(1,0);
            for(int k=0;k<i;k++,w=w*wn)
            {
                E x=a[j+k],y=w*a[j+k+i];
                a[j+k]=x+y,a[j+k+i]=x-y;
            }
        }
    }
    if(f==-1) fo(i,0,n-1) a[i].r=a[i].r/n;
}
int main()
{
    scanf("%d",&n);n--;
    fo(i,0,n)
      scanf("%lf",&a[i].r);
    fo(i,0,n-1)
      b[i].r=(-1.0)/((double)(n-i)*(double)(n-i));
    fo(i,n+1,n+n)
      b[i].r=-b[n+n-i].r;
    M=4*n;for(n=1;n<M;n<<=1) L++;M/=4;
    fo(i,0,n-1) R[i]=(R[i>>1]>>1)|((i&1)<<L-1);
    fft(a,1),fft(b,1);
    fo(i,0,n) c[i]=a[i]*b[i];
    fft(c,-1);
    fo(i,M,M+M) printf("%.3lf\n",c[i].r);
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值