博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【纪中集训2019.3.12】Z的礼物
阅读量:4585 次
发布时间:2019-06-09

本文共 4138 字,大约阅读时间需要 13 分钟。

题意

已知\(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

  • 斯特林反演():

    • \(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\)回去就好了;

  • 注意精度;

    #include
    #define ld long double#define ll long long using namespace std;const int N=400010,mod=1e9+7;const ld pi=acos(-1);int n,l,r,rev[N],fac[N],inv[N],p[N],a[N],b[N];char gc(){ static char*p1,*p2,s[1000000]; if(p1==p2)p2=(p1=s)+fread(s,1,1000000,stdin); return(p1==p2)?EOF:*p1++;}int rd(){ int x=0;char c=gc(); while(c<'0'||c>'9')c=gc(); while(c>='0'&&c<='9')x=(x<<1)+(x<<3)+c-'0',c=gc(); return x;}int pw(int x,int y){ int re=1; while(y){ if(y&1)re=(ll)re*x%mod; y>>=1,x=(ll)x*x%mod; } return re;}struct C{ ld x,y; C(ld _x=0,ld _y=0):x(_x),y(_y){}; C operator +(const C&A)const{return C(x+A.x,y+A.y);} C operator -(const C&A)const{return C(x-A.x,y-A.y);} C operator *(const C&A)const{return C(x*A.x-y*A.y,x*A.y+y*A.x);} C operator /(const ld&A)const{return C(x/A,y/A);} C operator !()const{return C(x,-y);}};void fft(C*A,int len,int f){ for(int i=0;i
    >1]>>1)|((i&1)<<(L-1));} 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); for(int i=n+1;i
    >1; solve(A,m); for(int i=0;i<=m;++i)t1[i]=(ll)A[i]*fac[i]%mod; for(int i=0,t=1;i<=m;++i,t=(ll)t*m%mod)t2[m-i]=(ll)t*inv[i]%mod; mul(t1,t2,m); for(int i=0;i<=m;++i){t1[i]=(ll)inv[i]*t1[m+i]%mod;} mul(A,t1,m);}int main(){ freopen("gift.in","r",stdin); freopen("gift.out","w",stdout); n=rd();l=rd();r=rd(); for(int i=1;i<=n;++i)p[i]=rd(); for(int i=fac[0]=inv[0]=1;i<=n;++i){ fac[i]=(ll)fac[i-1]*i%mod; inv[i]=pw(fac[i],mod-2); } solve(a,l-1); for(int i=l-1;i<=r;++i){ for(int j=1;j<=i;++j){ int t=(ll)a[j]*p[j]%mod; if((i-j)&1)b[i]=(b[i]-t+mod)%mod; else b[i]=(b[i]+t)%mod; } for(int j=i+1;j;--j){a[j]=(a[j-1]+(ll)a[j]*i)%mod;}a[0]=0; // b[i]=(b[i]-b[i-1]+mod)%mod; } for(int i=l;i<=r;++i)printf("%d ",(b[i]-b[i-1]+mod)%mod); return 0;}

转载于:https://www.cnblogs.com/Paul-Guderian/p/10519990.html

你可能感兴趣的文章
Linux基础命令小结
查看>>
黑马程序员--抽象类与接口
查看>>
IaaS,PaaS,SaaS 的区别
查看>>
Python复习基础篇
查看>>
关于Cocos2d-x中背景音乐和音效的添加
查看>>
.Net持续集成 —— Jenkins+Git+WebDeploy
查看>>
01_Numpy基本使用
查看>>
吴裕雄--天生自然 R语言开发学习:使用键盘、带分隔符的文本文件输入数据
查看>>
CSS选择器详解
查看>>
checkbox和文字对齐
查看>>
JConsole远程连接配置 服务器监控工具
查看>>
了解HTTP协议栈(实践篇)
查看>>
loj10035. 「一本通 2.1 练习 1」Power Strings
查看>>
%s的用法
查看>>
调用底层不能直接访问的类和方法
查看>>
清理缓存的方法 #DF
查看>>
JAVA array,map 转 json 字符串
查看>>
APICloud模块 aMapLBS.singleAddress在ios返回的是定位而不是地址
查看>>
【ZOJ】1610 Count the Colors
查看>>
抱歉最近朋友结婚去浪了几天~未来几天会正常更新.今天带来XML文件解析
查看>>