题目大意:

一次游戏要按N个按键。每个按键阿米巴有P[i]的概率按错。对于一串x个连续按对的按键,阿米巴可以得分

$f(x)=tan(\dfrac{x}{N})\times e^{arcsin(0.8\times \frac{x}{N})}\times N$

在阿米巴疯狂的玩这款游戏之前,小强想知道,阿米巴的期望得分是多少。

数据范围:$n≤10^5$

貌似题解是泰勒展开,然而我自己想的做法是分治FFT,最后写了个没有分治的FFT。

我们记$S_i$表示连续按下至少$i$个按键的期望次数。

那么答案显然为$\sum_{i=1}^{n}S_i-2S_{i+1}+S_{i+2}$

考虑如何求$S$,不难发现$S_i=\sum_{j=1}^{n-i+1}\prod_{k=0}^{i-1}(1-P[j+k])$

直接求显然是$O(n^3)$的,通过前缀积优化一发可以做到$O(n^2)$

我们构造序列$F$和序列$G$,令$F_i=\prod_{j=1}^{i}(1-P[j])$,$G_i=\dfrac{1}{\prod_{j=1}^{i-1}(1-P[n-j])}$。

不难发现,$S_i=\sum_{j=1}^{i}F_{j}G_{i-j+1}$

我们用FFT加速一波就可以求了

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

PS:此题卡精度,不要尝试使用两次FFT做卷积,要用三次FFT!!!

  1. #include<bits/stdc++.h>
  2. #define M (1<<18)
  3. #define PI acos(-1)
  4. using namespace std;
  5.  
  6. struct cp{
  7. double i,r;
  8. cp(double R=,double I=){i=I; r=R;}
  9. friend cp operator +(cp a,cp b){return cp(a.r+b.r,a.i+b.i);}
  10. friend cp operator -(cp a,cp b){return cp(a.r-b.r,a.i-b.i);}
  11. friend cp operator *(cp a,cp b){return cp(a.r*b.r-a.i*b.i,a.r*b.i+a.i*b.r);}
  12. friend cp operator /(cp a,double b){return cp(a.r/b,a.i/b);}
  13. }a[M],b[M];
  14. void change(cp a[],int len){
  15. for(int i=,j=;i<len-;i++){
  16. if(i<j) swap(a[i],a[j]);
  17. int k=len>>;
  18. while(j>=k) j-=k,k>>=;
  19. j+=k;
  20. }
  21. }
  22. void FFT(cp a[],int len,int on){
  23. change(a,len);
  24. for(int h=;h<=len;h<<=){
  25. cp wn=cp(cos(*PI/h),sin(*PI/h*on));
  26. for(int j=;j<len;j+=h){
  27. cp w=cp(,);
  28. for(int k=j;k<j+(h>>);k++){
  29. cp u=a[k],t=w*a[k+(h>>)];
  30. a[k]=u+t; a[k+(h>>)]=u-t;
  31. w=w*wn;
  32. }
  33. }
  34. }
  35. if(on==-){
  36. for(int i=;i<len;i++)
  37. a[i]=a[i]/len;
  38. }
  39. }
  40.  
  41. double p[M]={},s[M]={},ans=;int n;
  42. double f(double x){return tan(x/n)*exp(asin(0.8*x/n))*n;}
  43.  
  44. int main(){
  45. scanf("%d",&n);
  46. for(int i=;i<n;i++) scanf("%lf",p+i),p[i]=-p[i];
  47. a[].r=; for(int i=;i<n-;i++) a[i+].r=a[i].r/p[i];
  48. b[n-].r=p[]; for(int i=n-;~i;i--) b[i].r=b[i+].r*p[n-i-];
  49. int m=; for(;m<n*;m<<=);
  50. FFT(a,m,); FFT(b,m,);
  51. for(int i=;i<m;i++) a[i]=a[i]*b[i];
  52. FFT(a,m,-);
  53. for(int i=;i<=n;i++) s[i]=a[n-i].r;
  54. for(int i=;i<=n;i++) ans+=(s[i]-*s[i+]+s[i+])*f(i);
  55. printf("%.10lf\n",ans);
  56. }

【xsy1131】tortue FFT的更多相关文章

  1. 洛谷 P4721 【模板】分治 FFT 解题报告

    P4721 [模板]分治 FFT 题目背景 也可用多项式求逆解决. 题目描述 给定长度为 \(n−1\) 的数组 \(g[1],g[2],\dots,g[n-1]\),求 \(f[0],f[1],\d ...

  2. luoguP4721 【模板】分治 FFT

    P4721 [模板]分治 FFT 链接 luogu 题目描述 给定长度为 \(n-1\) 的数组 \(g[1],g[2],..,g[n-1]\),求 \(f[0],f[1],..,f[n-1]\),其 ...

  3. LG4721 【模板】分治 FFT

    P4721 [模板]分治 FFT 题目背景 也可用多项式求逆解决. 题目描述 给定长度为 $n-1$ 的数组 $g[1],g[2],..,g[n-1]$,求 $f[0],f[1],..,f[n-1]$ ...

  4. 【bzoj3160】万径人踪灭 FFT

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=3160 我是一个傻叉 微笑脸 #include<bits/stdc++.h> #de ...

  5. P4721【模板】分治 FFT

    瞎扯 虽然说是FFT但是还是写了一发NTT(笑) 然后忘了IDFT之后要除个n懵逼了好久 以及递归的时候忘了边界无限RE 思路 朴素算法 分治FFT 考虑到题目要求求这样的一个式子 \[ F_x=\S ...

  6. P4721 【模板】分治 FFT

    其实是分治ntt,因为fft会爆精度,真*裸题 分治过程和fft的一模一样,主要就是ntt精度高,用原根来代替fft中的\(w_n^k\) 1.定义:设m>1,(a,m)==1,满足\(a^r= ...

  7. 【hdu4609】 3-idiots FFT

    题外话:好久没写blog了啊-- 题目传送门 题目大意:给你m条长度为ai的线段,求在其中任选三条出来,能构成三角形的概率.即求在这n条线段中找出三条线段所能拼出的三角形数量除以$\binom{m}{ ...

  8. 【BZOJ-3527】力 FFT

    3527: [Zjoi2014]力 Time Limit: 30 Sec  Memory Limit: 256 MBSec  Special JudgeSubmit: 1544  Solved: 89 ...

  9. 【总结】对FFT的理解 / 【洛谷 P3803】 【模板】多项式乘法(FFT)

    题目链接 \(\Huge\text{无图,慎入}\) \(FFT\)即快速傅里叶变换,用于加速多项式乘法. 如果暴力做卷积的话就是一个多项式的每个单项式去乘另一个多项式然后加起来,时间复杂度为\(O( ...

随机推荐

  1. chrome,opera..通过file协议浏览html代码时,发送的ajax请求本地文件,会报跨域错误

    XMLHttpRequest cannot loadfile:///E:/webs/extJS/ext-3.3.0/examples/csdn/combobox.txt?_dc=14147389739 ...

  2. 2018.09.22 atcoder Snuke's Coloring 2(线段树+单调栈)

    传送门 就是给出一个矩形,上面有一些点,让你找出一个周长最大的矩形,满足没有一个点在矩形中. 这个题很有意思. 考虑到答案一定会穿过中线. 于是我们可以把点分到中线两边. 先想想暴力如何解决. 显然就 ...

  3. hdu-1394(线段树)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1394 思路:建立一个空线段树,求出逆序数,(逆序数性质:交换两个相邻数,逆序数+1或-1, 交换两个不 ...

  4. Django入门指南-第9章:静态文件设置(完结)

    http://127.0.0.1:8000 #下一步是告诉Django在哪里可以找到静态文件.打开settings.py,拉到文件的底部,在STATIC_URL后面添加以下内容: STATICFILE ...

  5. UVa 11292 Dragon of Loowater (水题,排序)

    题意:有n个条龙,在雇佣勇士去杀,每个勇士能力值为x,只能杀死头的直径y小于或等于自己能力值的龙,只能被雇佣一次,并且你要给x赏金,求最少的赏金. 析:很简单么,很明显,能力值高的杀直径大的,低的杀直 ...

  6. 深入浅析JavaScript中with语句的理解

    JavaScript 有个 with 关键字, with 语句的原本用意是为逐级的对象访问提供命名空间式的速写方式. 也就是在指定的代码区域, 直接通过节点名称调用对象. with语句的作用是暂时改变 ...

  7. LdA笔记

    LDA算法最初的论文使用的是变分EM方法训练(Variational Inference).该方法较为复杂,而且最后训练出的topic主题非全局最优分布,而是局部最优分布.后期发明了Collapsed ...

  8. iOS的block内存管理

    初始情况下: block本身.__block修饰的变量以及在block内部使用的变量都是在栈里的. __block修饰的变量的地址会作为实参传入block块内部(暂时先这么理解,实际比较复杂).blo ...

  9. button设置边宽和圆角

       UIButton *meifuButton = [UIButton buttonWithType:UIButtonTypeSystem];         [meifuButton setTit ...

  10. 20155302 2016-2017-2 《Java程序设计》第六周学习总结

    20155302 2016-2017-2 <Java程序设计>第6周学习总结 教材学习内容总结 Java中的流分为两种,一种是字节流,另一种是字符流,分别由四个抽象类来表示(每种流包括输入 ...