题目大意:

  设$S(n,m)$为第二类斯特林数,$F_i$表示斐波那契数列第$i$项。

  给定$n,R,K$,求$\sum\limits_{i=1}^{n}(\sum\limits_{m=1}^{R}F_i)!i!\sum\limits_{l=0}^{i}\sum\limits_{j=0}^{\sum\limits_{t=1}^{R}F_t}\frac{S(k,i-l)}{l!}\frac{S(i,\sum\limits_{w=1}^{R}F_w-j)}{j!}$的值$mod$ $1000000007$。

  其中$n,R\leq10^{18}$,$k\leq2*10^5$

题解:

  (爽感)

  这道题...精神污染。。。当然也包括题解的$O(k)$做法。。。

  于是我就自己YY了一个$O(klogk)$的能过的做法.

  首先,需要知道三个小结论:

    1.$\sum\limits_{i=1}^{n}F_i=F_{n+2}-1$,用归纳法可以轻松证明。

    2.$m^n=\sum\limits_{i=1}^{m}S(n,i)C_m^ii!$

    3.$S(n,m)=\frac{1}{m!}\sum\limits_{i=0}^m(-1)^iC_m^i(m-i)^n$,本质上为结论2经二项式反演后的结果。

  证明一下第二个结论:

    考虑构造,把$n$个不同的球放入$m$个不同的盒子里,允许有空盒的方案数。

    显然,每个球都有$m$种选择方法,答案是$m^n$。

    换一种思维方式,可以想成枚举这$n$个球放入了那些盒子里,由于$S(n,m)$表示$n$个不同的球放入$m$个相同的盒子里无空盒的方案数,所以在乘上$C_m^ii!$。

  然后就可以开心的化式子了:

  设$L=\sum\limits_{m=1}^{R}F_i$,再把原式挪一下就变成了:

    $\sum\limits_{i=1}^{n}\sum\limits_{l=0}^{i}i!\frac{S(k,i-l)}{l!}\sum\limits_{j=0}^LL!\frac{S(i,L-j)}{j!}$

  然后我们神奇的发现后面的两个式子形式相同,以后一个为例:

    $\sum\limits_{j=0}^LL!\frac{S(i,L-j)}{j!}$,换成枚举$L-j$

    $=\sum\limits_{j=0}^LL!\frac{S(i,j)}{(L-j)!}$

    $=\sum\limits_{j=0}^LS(i,j)C_L^jj!$,这不就是结论2吗,直接等于$L^i$

  因此原式直接变为$\sum\limits_{i=0}^nL^ii^k$,但$n$依然很大。

  注意当$L=1$时式子变为$\sum\limits_{i=0}^ni^k$,需要用拉格朗日插值法求解,详见CF622F.

  若$L\neq1$,我的做法是把$i^k$变回斯特林数,即$\sum\limits_{i=0}^nL^i\sum\limits_{j=0}^kS(k,j)C_i^jj!$

  交换求和号,即$\sum\limits_{j=0}^kS(k,j)j!\sum\limits_{i=j}^nC_i^jL^i$,考虑如何快速求出$\sum\limits_{i=j}^nC_i^jL^i$。

  设$g(x)=\sum\limits_{i=x}^nC_i^xL^i$

  推导一波:

  $g(x)=\sum\limits_{i=x}^nL^iC_i^x$
  $=\sum\limits_{i=x}^nL^iC_{i-1}^{x-1}+\sum\limits_{i=x}^nL^iC_{i-1}^x$
  $=L\sum\limits_{i=x-1}^{n-1}L^{i}C_{i}^{x-1}+L\sum\limits_{i=x}^{n-1}L^{i}C_{i}^x$
  $=L(g(x-1)-L^nC_n^{x-1})+L(g(x)-L^nC_n^x)$

  在整理一下就是:$g(x)=\frac{Lg(x-1)-L^{n+1}C_{n+1}^x}{1-L}$,那么就可以$O(k)$的复杂度求出$g(x)$

  到此为止,原式变为$\sum\limits_{j=1}^kS(k,j)j!g(j)$,问题就剩下如何求第二类斯特林数$S(k,j)$了。

  应用第三个结论:$S(n,m)=\frac{1}{m!}\sum\limits_{i=1}^m(-1)^iC_m^i(m-i)^n$,将其化为卷积形式:

  $S(n,m)=\sum\limits_{i=1}^m\frac{(-1)^i}{i!}\frac{(m-i)^n}{(m-i)!}$$NTT$即可。

  又由于模数不是$NTT$模数,因此需要$MTT$来实现。

 

  1. #include<cmath>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #define N 530010
  5. #define Re register
  6. #define ld long double
  7. #define mod 1000000007
  8. #define pi (ld)acos(-1)
  9. #pragma GCC optimize(3)
  10. #pragma GCC optimize("inline")
  11. #pragma GCC optimize("Ofast")
  12. using namespace std;
  13. typedef long long ll;
  14. struct node{ll a[][];}tt,an;
  15. int k,R[N];
  16. ll n,r,ans,y[N],S[N],fac[N],inv[N];
  17. node mul(const node&x,const node&y)
  18. {
  19. node ret;
  20. for(Re int i = ;i<=;i++)
  21. {
  22. for(Re int j = ;j<=;j++)
  23. {
  24. ret.a[i][j] = ;
  25. for(Re int k = ;k<=;k++)
  26. ret.a[i][j] = (ret.a[i][j]+x.a[i][k]*y.a[k][j]%mod)%mod;
  27. }
  28. }return ret;
  29. }
  30. inline void mpow(ll y)
  31. {
  32. an.a[][] = an.a[][] = ;
  33. while(y)
  34. {
  35. if(y&)an = mul(an,tt);
  36. tt = mul(tt,tt),y>>=;
  37. }
  38. }
  39. ll ksm(ll x,ll y)
  40. {
  41. ll fin = ;
  42. x%=mod,y%=mod-;
  43. while(y)
  44. {
  45. if(y&)fin = fin*x%mod;
  46. x = x*x%mod,y>>=;
  47. }return fin;
  48. }
  49. struct fs
  50. {
  51. ld x,y;
  52. friend fs operator+(const fs&a,const fs&b){return (fs){a.x+b.x,a.y+b.y};}
  53. friend fs operator-(const fs&a,const fs&b){return (fs){a.x-b.x,a.y-b.y};}
  54. friend fs operator*(const fs&a,const fs&b){return (fs){a.x*b.x-a.y*b.y,a.x*b.y+a.y*b.x};}
  55. }a[N],b[N],c[N],d[N],e[N],f[N],g[N],h[N];
  56. inline void FFT(fs*A,int lim,int fl)
  57. {
  58. for(Re int i = ;i<lim;i++)if(i<R[i])swap(A[i],A[R[i]]);
  59. for(Re int i = ;i<=lim;i<<=)
  60. {
  61. fs wn = (fs){cos(*pi/i),fl*sin(*pi/i)};
  62. for(Re int j = ;j<lim;j+=i)
  63. {
  64. fs w = (fs){,};
  65. for(Re int k = ;k<i>>;k++)
  66. {
  67. fs x = A[j+k],y = w*A[j+k+(i>>)];
  68. A[j+k] = x+y,A[j+k+(i>>)] = x-y;
  69. w = w*wn;
  70. }
  71. }
  72. }if(fl==-)for(Re int i = ;i<lim;i++)A[i].x/=lim;
  73. }
  74. inline void p2()
  75. {
  76. for(Re int i = ;i<=k+;i++)y[i] = (y[i-]+ksm(i,k))%mod;
  77. for(Re int i = ;i<=k+;i++)
  78. {
  79. int t = ;
  80. for(Re int j = ;j<=k+;j++)
  81. {
  82. if(i==j)continue;
  83. t = t*(n%mod-j)%mod*ksm(i-j,mod-)%mod;
  84. }ans = (ans+y[i]*t%mod)%mod;
  85. }printf("%lld",(ans+mod)%mod),exit();
  86. }
  87. int main()
  88. {
  89. freopen("c.in","r",stdin);
  90. freopen("c.out","w",stdout);
  91. scanf("%lld%lld%d",&n,&r,&k);
  92. tt.a[][] = tt.a[][] = tt.a[][] = ;
  93. mpow(r+);
  94. r = an.a[][]-;
  95. if(r==)p2();
  96. fac[] = fac[] = inv[] = inv[] = ;
  97. for(Re int i = ;i<=k;i++)fac[i] = fac[i-]*i%mod,inv[i] = (mod-mod/i)*inv[mod%i]%mod;
  98. for(Re int i = ;i<=k;i++)inv[i] = inv[i]*inv[i-]%mod;
  99. for(Re int i = ;i<=k;i++)
  100. {
  101. ll A = (inv[i]*(i&?-:)+mod)%mod;
  102. ll B = ksm(i,k)*inv[i]%mod;
  103. a[i].x = (ld)(A>>);
  104. b[i].x = (ld)(A&0x7fff);
  105. c[i].x = (ld)(B>>);
  106. d[i].x = (ld)(B&0x7fff);
  107. }
  108. int lim = ,bit = ;
  109. while(lim<=k<<)lim<<=,bit++;
  110. for(Re int i = ;i<lim;i++)R[i] = (R[i>>]>>)|((i&)<<bit-);
  111. FFT(a,lim,),FFT(b,lim,),FFT(c,lim,),FFT(d,lim,);
  112. for(Re int i = ;i<lim;i++)
  113. {
  114. e[i] = a[i]*c[i];
  115. f[i] = a[i]*d[i]+b[i]*c[i];
  116. g[i] = b[i]*d[i];
  117. }
  118. FFT(e,lim,-),FFT(f,lim,-),FFT(g,lim,-);
  119. for(Re int i = ;i<=k;i++)
  120. {
  121. ll E = (ll)round(e[i].x)%mod,F = (ll)round(f[i].x)%mod,G = (ll)round(g[i].x)%mod;
  122. S[i] = (((E<<)%mod+(F<<)%mod+G)%mod+mod)%mod;
  123. }
  124. ll lst = (ksm(r,n+)-)*ksm(r-,mod-)%mod,now = ,t = ksm(r,n+),tt = ksm(-r,mod-);
  125. for(Re int i = ;i<=k;i++)
  126. {
  127. now = now*(n%mod+-i)%mod;
  128. lst = (lst*r%mod-now*inv[i]%mod*t%mod)%mod*tt%mod;
  129. ans = (ans+S[i]*fac[i]%mod*lst%mod)%mod;
  130. }printf("%lld",(ans+mod)%mod);
  131. return ;
  132. }

2019.10.02模拟赛T3的更多相关文章

  1. 2019.10.18模拟赛T3

    题目大意: 求$\sum\limits_{i=1}^n\sum\limits_{j=1}^n[lcm(i,j)>n](n\leq 10^{10})$的值. 题解: 这题貌似有n多种做法... 为 ...

  2. [10.18模拟赛] 序列 (DP)

    [10.18模拟赛] 序列 题目描述 山山有一个整数序列s1,s2,-,sn,其中1≤si≤k. 求出有多少个准确移除m个元素后不同的序列.答案模(1e9+7) 输入 输入包括几个测试用例,并且由文件 ...

  3. [10.12模拟赛] 老大 (二分/树的直径/树形dp)

    [10.12模拟赛] 老大 题目描述 因为 OB 今年拿下 4 块金牌,学校赞助扩建劳模办公室为劳模办公室群,为了体现 OI 的特色,办公室群被设计成了树形(n 个点 n − 1 条边的无向连通图), ...

  4. EZ 2018 06 10 NOIP2018 模拟赛(十八)

    好久没写blog&&比赛题解了,最近补一下 这次还是很狗的,T3想了很久最后竟然连并查集都忘写了,然后T2map莫名爆炸. Rating爆减......链接不解释 好了我们开始看题. ...

  5. 体育成绩统计——20180801模拟赛T3

    体育成绩统计 / Score 题目描述 正所谓“无体育,不清华”.为了更好地督促同学们进行体育锻炼,更加科学地对同学们进行评价,五道口体校的老师们在体育成绩的考核上可谓是煞费苦心.然而每到学期期末时, ...

  6. 2018.10.17NOIP模拟赛解题报告

    心路历程 预计得分:\(100 + 100 +100\) 实际得分:\(100 + 100 + 60\) 辣鸡模拟赛.. 5min切掉T1,看了一下T2 T3,感觉T3会被艹爆因为太原了.. 淦了20 ...

  7. 20180520模拟赛T3——chess

    [问题描述] 小美很喜欢下象棋. 而且她特别喜欢象棋中的马. 她觉得马的跳跃方式很独特.(以日字格的方式跳跃) 小芳给了小美一张很大的棋盘,这个棋盘是一个无穷的笛卡尔坐标. 一开始\(time=0\) ...

  8. 【2019.10.7 CCF-CSP-2019模拟赛 T3】未知的数组(unknown)(并查集+动态规划)

    预处理 考虑模数\(10\)是合数不好做,所以我们可以用一个常用套路: \(\prod_{i=l}^ra_i\equiv x(mod\ 10)\)的方案数等于\(\prod_{i=l}^ra_i\eq ...

  9. 【2019.8.6 慈溪模拟赛 T3】集合(set)(线段树上DP)

    线段树上\(DP\) 首先发现,每个数肯定是向自己的前驱或后继连边的. 则我们开一棵权值线段树,其中每一个节点记录一个\(f_{0/1,0/1}\),表示在这个区间左.右端点是否连过边的情况下,使这个 ...

随机推荐

  1. Entity Framework Core Code First 项目实践

    Entity Framework Core Code First 实践 任何一种技术的出现都是为了解决一系列特定的问题,只有了解了技术所要解决的关键问题,才能理解它的真正用途,之后,才能在实践中用好它 ...

  2. Hibernate 框架 -HQL 语法

    HQL ( Hibernate Query Language ) 查询语言是面向对象的查询语言,也是在 Hibernate 中最常见的.其语法和 SQL 语法有一些相似,功能十分强大,几乎支持除特殊 ...

  3. 12-《Node.js开发指南》-核心模块

    全局对象 Node.js中的全局对象是global 所有全局变量(除了global本身以外)都是global对象的属性 最根本的作用为全局变量的宿主 全局变量 //满足以下条件的是全局变量 a.在最外 ...

  4. linux的装配与虚拟机的快照

    一.科普 1969年,“c语言之父”,“b语言之父”,ken Thompson,开发了一个叫unics系统,是unix系统的雏形,只不过此时的UNICS是用汇编语言写的.移植到其它计算机上需要改很多源 ...

  5. Laravel 即时应用的一种实现方式

    即时交互的应用 在现代的 Web 应用中很多场景都需要运用到即时通讯,比如说最常见的支付回调,与三方登录.这些业务场景都基本需要遵循以下流程: 客户端触发相关业务,并产生第三方应用的操作(比如支付) ...

  6. swoole比php好在哪里

    直接套用Swoole官网的介绍: PHP的异步.并行.高性能网络通信引擎,使用纯C语言编写,提供了PHP语言的异步多线程服务器,异步TCP/UDP网络客户端,异步MySQL,异步Redis,数据库连接 ...

  7. 动态数组原理【Java实现】(六)

    前言 接下来我们进入集合学习,看过很多文章一上来就是讲解原理感觉会特别枯燥,任何成熟解决方案的出现都是为了解决问题,若通过实际问题引入然后再来讲解原理想必学起来必定事半功倍,从我写博客的那一天起,我就 ...

  8. (转)阿里 RocketMQ 安装与简介

    原文:阿里 RocketMQ 安装与简介 一.简介 官方简介: l  RocketMQ是一款分布式.队列模型的消息中间件,具有以下特点: l  能够保证严格的消息顺序 l  提供丰富的消息拉取模式 l ...

  9. java基础(4):引用数据类型、流程控制语句

    1. 引用数据类型 1.1 Scanner类 我们要学的Scanner类是属于引用数据类型,我们先了解下引用数据类型. 引用数据类型的使用: 与定义基本数据类型变量不同,引用数据类型的变量定义及赋值有 ...

  10. C#中实现文件重命名的方式

    场景 在C#中如果是删除文件的话可以直接使用 if (System.IO.File.Exists(fileName)) { System.IO.File.Delete(fileName); } 但是如 ...