题意

已知\(a_{i} = \sum_{j=1}^{i} \{^{i} _{j} \}b_{j}\), 给出\(a_{1} 到 a_{n}\) ;

求\(b_{l} 到 b_{r}\)在\(1e9+7\)的意义下取模的值;

\(1 \le l \le r \le n \le 10^5\)

\(r-l \le 100\)

\(0 \le a_{i} \lt 10^9 + 7\)

题解

  • Part1

  • 斯特林反演(https://www.cnblogs.com/hchhch233/p/10016543.html):

    • \(f(n) = \sum_{i=1}^{n} \{^n_i\} g(n) \Longleftrightarrow g(n) = \sum_{i=1}^{n} (-1)^{n-i} [^n_i]f(i)\)
  • 由于\(r-l\)比较小,可以直接暴力求,只需要快速求出\([^n_1] - [^n_n]\)

  • \([_m^n] = [x^m] x^{\overline n}\) , 其中\(x^{\overline n} = \Pi_{i=1}^n(x+i-1)\)

  • Part 2

  • 直接做是\(n log ^2n\)的,假设在计算\(F_n(x) = x^{\overline n}\)时已经计算了\(F_\frac{n}{2}(x)\),记\(m = \frac{n}{2} , F_{m} = \sum_{i=0}^{m}a_{i} x^{i}\)

  • 只需要计算\(F'_{m} (x) = F_{m}(x+m)\)和\(F_{m}\)相乘;

  • \[F'_m(x) = \sum_{i=0}^{m} a_{i} (x+m)^i \\ = \sum_{i=0}^{m} a _{i}\sum_{j=0}^{i}(^i_j)x^j m^{i-j} \\ = \sum_{i=0}^{m} \sum_{j=0}^{i} a_{i} \frac{i!}{j!(i-j)!}x^{j}m^{i-j} \\ = \sum_{i=0}^{m} \frac{x^i}{i!} \sum_{j=0}^{m-i} a_{i+j}(i+j)! \ \frac{m^{j}}{j!}
    \]

  • 记$A(x)=\sum_{i=0}^{m} a_{i} i! x^{i}, B(x) = \sum_{i=0}{m}\frac{m{i}}{i!} x^{m-i} $

  • 相乘之后取第\(m+i\)项可以算后面的东西

  • Part 3

  • 可是不是\(ntt\)模数,直接取模会爆\(long \ long\)需要用到拆系数\(ntt\);

  • 将\(A(x)*B(x)\)分解成\((k * A1(x) + A2(x)) * (k * B1(x) + B2(x)) , k 一般取\sqrt{n} (2^{15} ) 左右\)

  • 暴力是7次\(fft\),可以优化到需要4次\(fft\)

  • 两次\(fft\)合并成一次的做法,需要计算\(dft(A(x))和dft(B(x))\)

  • 记: $$\begin{align} P(x) = A(x) + iB(x)\ Q(x) = A(x) -iB(x) \end{align}$$

  • 考虑直接做\(P\)为\(P’\),考虑\(Q \ dft\)之后的结果\(Q'\)

    \[\begin{align} Q'[k] &= A(w_{n}^{k}) - iB(w_{n}^{k}) \\ &= \sum_{j=0}^{n-1} (a_{j}-ib_{j})w^{jk}_{n} \\ &= \sum_{j=0}^{n-1}(a_{j}-ib_{j})(cos(\frac{2\pi jk}{n} ) + isin(\frac{2\pi jk}{n}) ) \\ &= \sum_{j=0}^{n-1}(a_{j}cos(\frac{2\pi jk}{n}) + b_{j}sin(\frac{2\pi jk}{n}))- i(b_{j}cos(\frac{2\pi jk}{n}) - a_{j}sin(\frac{2\pi jk}{n})) \\ &= conj \sum_{j=0}^{n-1} (a_{j}cos(\frac{-2\pi jk}{n}) - b_{j}sin(\frac{-2\pi jk}{n} ) ) +i( b_{j}cos(\frac{-2\pi jk}{n}) + a_{j}sin(\frac{-2\pi jk}{n})) \\ &= conj \sum_{j=0}^{n-1} (a_{j}+ib_{j})(cos(\frac{-2\pi jk}{n})+isin(\frac{-2\pi jk}{n})) \\ &= conj \ \sum_{j=0}^{n-1} (a_{j}+ib_{j})w^{-jk}_{n} \\ &= conj \ P'[n-k] \end{align}
    \]

  • 所以由\(P'\)直接得到\(Q'\):

  • 即:$$ \begin{align} A'(x) = \frac{P'(x) + Q'(x)}{2} \ B'(x) = \frac{P'(x) - Q'(x)}{2i}\end{align} g $$

  • 结果也存在实部和虚部里直接\(idft\)回去就好了;

  • 注意精度;

    1. #include<bits/stdc++.h>
    2. #define ld long double
    3. #define ll long long
    4. using namespace std;
    5. const int N=400010,mod=1e9+7;
    6. const ld pi=acos(-1);
    7. int n,l,r,rev[N],fac[N],inv[N],p[N],a[N],b[N];
    8. char gc(){
    9. static char*p1,*p2,s[1000000];
    10. if(p1==p2)p2=(p1=s)+fread(s,1,1000000,stdin);
    11. return(p1==p2)?EOF:*p1++;
    12. }
    13. int rd(){
    14. int x=0;char c=gc();
    15. while(c<'0'||c>'9')c=gc();
    16. while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+c-'0',c=gc();
    17. return x;
    18. }
    19. int pw(int x,int y){
    20. int re=1;
    21. while(y){
    22. if(y&1)re=(ll)re*x%mod;
    23. y>>=1,x=(ll)x*x%mod;
    24. }
    25. return re;
    26. }
    27. struct C{
    28. ld x,y;
    29. C(ld _x=0,ld _y=0):x(_x),y(_y){};
    30. C operator +(const C&A)const{return C(x+A.x,y+A.y);}
    31. C operator -(const C&A)const{return C(x-A.x,y-A.y);}
    32. C operator *(const C&A)const{return C(x*A.x-y*A.y,x*A.y+y*A.x);}
    33. C operator /(const ld&A)const{return C(x/A,y/A);}
    34. C operator !()const{return C(x,-y);}
    35. };
    36. void fft(C*A,int len,int f){
    37. for(int i=0;i<len;++i)if(i<rev[i])swap(A[i],A[rev[i]]);
    38. for(int i=1;i<len;i<<=1){
    39. C wn=C(cos(pi/i),f*sin(pi/i));
    40. for(int j=0;j<len;j+=i<<1){
    41. C w=C(1,0);
    42. for(int k=0;k<i;++k,w=w*wn){
    43. C x=A[j+k],y=w*A[j+k+i];
    44. A[j+k]=x+y,A[j+k+i]=x-y;
    45. }
    46. }
    47. }
    48. if(!~f){for(int i=0;i<len;++i){A[i]=A[i]/len;}}
    49. }
    50. void mul(int*A,int*B,int n){
    51. static C t1[N],t2[N],t3[N],t4[N];
    52. int L,len;
    53. for(L=0,len=1;len<(n+1)<<1;++L,len<<=1);
    54. for(int i=0;i<len;++i){rev[i]=(rev[i>>1]>>1)|((i&1)<<(L-1));}
    55. for(int i=0;i<=n;++i)t1[i]=C(A[i]>>15,A[i]&0x7fff),t2[i]=C(B[i]>>15,B[i]&0x7fff);
    56. for(int i=n+1;i<len;++i)t1[i]=t2[i]=C(0,0);
    57. fft(t1,len,1),fft(t2,len,1);
    58. for(int i=0;i<len;++i){
    59. C x1=t1[i],y1=!t1[(len-i)&(len-1)];
    60. C x2=t2[i],y2=!t2[(len-i)&(len-1)];
    61. t3[i]=(x1+y1)*x2*C(0.5,0);
    62. t4[i]=(x1-y1)*x2*C(0,-0.5);
    63. // t3[i]=((x1+y1)*(x2+y2)+(x1+y1)*(x2-y2))*C(0.25,0);
    64. // t4[i]=((x1-y1)*(x2+y2)+(x1-y1)*(x2-y2))*C(0,-0.25);
    65. }
    66. fft(t3,len,-1),fft(t4,len,-1);
    67. for(int i=0;i<=n<<1;++i){
    68. A[i]=((((ll)(t3[i].x+0.1)%mod)<<30)+(((ll)(t3[i].y+t4[i].x+0.1)%mod)<<15)+(ll)(t4[i].y+0.1))%mod;
    69. }
    70. }
    71. void solve(int*A,int n){
    72. if(n==0){A[0]=1;return;}
    73. if(n==1){A[1]=1;return;}
    74. if(n&1){
    75. solve(A,n-1);
    76. for(int i=n;i;--i)A[i]=(A[i-1]+(ll)A[i]*(n-1))%mod;
    77. A[0]=0;
    78. return;
    79. }
    80. static int t1[N],t2[N];
    81. int m=n>>1;
    82. solve(A,m);
    83. for(int i=0;i<=m;++i)t1[i]=(ll)A[i]*fac[i]%mod;
    84. for(int i=0,t=1;i<=m;++i,t=(ll)t*m%mod)t2[m-i]=(ll)t*inv[i]%mod;
    85. mul(t1,t2,m);
    86. for(int i=0;i<=m;++i){t1[i]=(ll)inv[i]*t1[m+i]%mod;}
    87. mul(A,t1,m);
    88. }
    89. int main(){
    90. freopen("gift.in","r",stdin);
    91. freopen("gift.out","w",stdout);
    92. n=rd();l=rd();r=rd();
    93. for(int i=1;i<=n;++i)p[i]=rd();
    94. for(int i=fac[0]=inv[0]=1;i<=n;++i){
    95. fac[i]=(ll)fac[i-1]*i%mod;
    96. inv[i]=pw(fac[i],mod-2);
    97. }
    98. solve(a,l-1);
    99. for(int i=l-1;i<=r;++i){
    100. for(int j=1;j<=i;++j){
    101. int t=(ll)a[j]*p[j]%mod;
    102. if((i-j)&1)b[i]=(b[i]-t+mod)%mod;
    103. else b[i]=(b[i]+t)%mod;
    104. }
    105. for(int j=i+1;j;--j){a[j]=(a[j-1]+(ll)a[j]*i)%mod;}a[0]=0;
    106. // b[i]=(b[i]-b[i-1]+mod)%mod;
    107. }
    108. for(int i=l;i<=r;++i)printf("%d ",(b[i]-b[i-1]+mod)%mod);
    109. return 0;
    110. }

【纪中集训2019.3.12】Z的礼物的更多相关文章

  1. 【纪中集训2019.3.12】Mas的仙人掌

    题意: ​ 给出一棵\(n\)个点的树,需要加\(m\)条边,每条边脱落的概率为\(p_{i}\) ,求加入的边在最后形成图中仅在一个简单环上的边数的期望: \(1 \le n \ , m \le 1 ...

  2. 【纪中集训2019.3.27】【集训队互测2018】小A的旅行(白)

    题目 描述 ​ \(0-n-1\)的图,满足\(n\)是\(2\)的整数次幂, $ i \to j $ 有 $ A_{i,j} $ 条路径: ​ 一条路径的愉悦值定义为起点和终点编号的\(and\)值 ...

  3. 【纪中集训2019.3.23】Deadline

    题意 描述 一个二分图\((A,B)\),每个点额外有一个颜色0或者1: 匹配时,只能相同颜色的点匹配: 给出\(A\)中的颜色,问如何分配\(B\)种的颜色使得\((A,B)\)的最大匹配最小: 范 ...

  4. 【纪中集训2019.3.23】IOer

    题目 描述 你要在\(m\)天内,刷\(n\)道题,每天可以刷的题的数目不限: 第\(i\)天可以刷的题目的种类是\(ui+v\): 两种刷题的方案不同当且仅当某天刷题的数量不同或者依次刷题的种类不同 ...

  5. 【纪中集训2019.3.11】Cubelia

    题目: 描述 给出长度为\(n\)的数组\(a\)和\(q\)个询问\(l,r\). 求区间\([l,r]\)的所有子区间的前缀和的最大值之和: 范围: $n \le 2 \times 10^5 , ...

  6. 【纪中集训2019.3.13】fft

    题意: 描述 一共有\(n+m\)道题,其中\(n\)道答案是\(A\),\(m\)道答案是\(B\): 你事先知道\(n和m\),问在最优情况下的期望答错次数,对\(998244353\)取模: 范 ...

  7. 「中山纪中集训省选组D1T1」最大收益 贪心

    题目描述 给出\(N\)件单位时间任务,对于第\(i\)件任务,如果要完成该任务,需要占用\([S_i, T_i]\)间的某个时刻,且完成后会有\(V_i\)的收益.求最大收益. 澄清:一个时刻只能做 ...

  8. 纪中集训 Day 2

    今天(其实是昨天= =)早上起来发现好冷好冷啊= = 吃完饭就准备比赛了,好吧B组难度的题总有一道不知到怎么写QAQ 太弱了啊!!! 蒟蒻没人权啊QAQ 今天第4题不会写,在这里说说吧 题目的意思就是 ...

  9. 纪中集训 Day1

    今天早上起来吃饭,发现纪中伙食真的是太差了!!!什么都不热,早餐的面包还好,然后就迎来了美好的早晨= = 早上做一套题,T1T2果断秒,T3一看就是noi原题,还好看过题解会写,然后就愉快的码+Deb ...

随机推荐

  1. Linux虚拟机安装教程

    必备组件: vmware(程序主题) 链接:https://pan.baidu.com/s/14OplOGOQTVAnf0iDqgDhDQ 提取码:jape centos(Linux系统) 链接:ht ...

  2. Redis学习(一):CentOS下redis安装和部署

    1.基础知识  redis是用C语言开发的一个开源的高性能键值对(key-value)数据库.它通过提供多种键值数据类型来适应不同场景下的存储需求,目前为止redis支持的键值数据类型如下字符串.列表 ...

  3. fragment的学习

    这个讲的不错 http://blog.csdn.net/lmj623565791/article/details/37992017  Fragment与Activity交互的几种方式(二,使用Bund ...

  4. 对于Redis的了解

    Redis :高性能的key-value数据库,支持存储的value类型包括字符串.链表.集合.有序集合.哈希类型. redis使用两种文件格式:全量数据和增量请求. 全量数据格式是将内存中的数据写入 ...

  5. PAT 甲级 1004 Counting Leaves

    https://pintia.cn/problem-sets/994805342720868352/problems/994805521431773184 A family hierarchy is ...

  6. PAT 1147 Heaps

    https://pintia.cn/problem-sets/994805342720868352/problems/994805342821531648 In computer science, a ...

  7. 面试问题总结二(技术能力-PHP)----Ⅲ

    42.什么是单点登录? 答:单点登录 SSO(Single Sign On)说得简单点就是在一个多系统共存的环境下,用户在一处登录后,就不用在其他系统中登录,也就是用户的一次登录能得到其他所有系统的信 ...

  8. windows多线程(十) 生产者与消费者问题

    一.概述 生产者消费者问题是一个著名的线程同步问题,该问题描述如下:有一个生产者在生产产品,这些产品将提供给若干个消费者去消费,为了使生产者和消费者能并发执行,在两者之间设置一个具有多个缓冲区的缓冲池 ...

  9. 【硬件】- 英特尔CPU命名规则

    前言 一款Intel CPU的命名,一般由5个部分组成:品牌,品牌标识符,Gen标识,SKU数值,产品线后缀. 以下图为例: 品牌 英特尔旗下处理器有许多子品牌,包括我们熟悉的凌动(ATOM).赛扬( ...

  10. [转帖]go 的goroutine 以及 channel 的简介.

    进程,线程的概念在操作系统的书上已经有详细的介绍.进程是内存资源管理和cpu调度的执行单元.为了有效利用多核处理器的优势,将进程进一步细分,允许一个进程里存在多个线程,这多个线程还是共享同一片内存空间 ...