题目

求逆续对个数为\(k\)的\(n\)阶排列个数\(mod \ 1e9+7\)

$1 \le n \ , \ k \le 10^5 $ 

题解

  • $f_{i,j} = \sum_{k=0}^{i-1} f_{i-1,j-k} $

  • 则有\(F_i(x) = F_{i-1}(x) * \sum_{j=0}^{i-1}x^j = F_{i-1}(x)\frac{1-x^i}{1-x}\)

  • $F(x) \ = \ \frac{\prod_{i=1}{n}1-xi}{(1-x)^n} $

  • 分母可以直接展开成$ \sum_i C_{n+i-1}^{i} x^i $

  • 分子的求法有两种:

    • 1.取\(= exp(ln(\prod 1-x^i)) = exp( -\sum_{j\ge1} \frac{x^{ij}}{j})\)

    由于只需要前\(K\)项,所以求exp里面的部分是\(n log \ n\),接着套exp模板

    时间复杂度:\(O(n \ log \ n )\) (由于要写mtt常数巨大...)

    • 2.这个式子本质是一个背包问题,注意到可选的物品个数不超过\(\sqrt{2K}\)

    设\(g_{i,j}\)表示选了\(i\)个物品,容积为\(j\)的系数和,考虑体积的变化

    \(g_{i,j} \ = \ g_{i,j-i} - g_{i-1,j-i} + g_{i-1,j-n-1}\)

    时间复杂度:$O(n \sqrt{N}) $

Code

  1. //sol 2
  2. #include<bits/stdc++.h>
  3. #define ll long long
  4. #define ld double
  5. #define mod 1000000007
  6. #define il inline
  7. #define rg register
  8. using namespace std;
  9. const int N=100010,M=500;
  10. int n,m,K,fac[N<<1],inv[N<<1],ny[N<<1],f[M][N],a[N];
  11. il void dec(int&x,int y){x-=y;if(x<0)x+=mod;}
  12. il void inc(int&x,int y){x+=y;if(x>=mod)x-=mod;}
  13. int cal(int x,int y){return x<y?0:1ll*fac[x]*inv[y]%mod*inv[x-y]%mod;}
  14. int main(){
  15. freopen("b.in","r",stdin);
  16. freopen("b.out","w",stdout);
  17. scanf("%d%d",&n,&K);
  18. ny[1]=fac[0]=inv[0]=1;
  19. for(int i=2;i<=n+K;++i)ny[i]=1ll*(mod-mod/i)*ny[mod%i]%mod;
  20. for(int i=1;i<=n+K;++i){
  21. fac[i]=1ll*fac[i-1]*i%mod;
  22. inv[i]=1ll*inv[i-1]*ny[i]%mod;
  23. }
  24. m=sqrt(2*K)+1;f[0][0]=1;
  25. for(int i=1;i<=m;++i)
  26. for(int j=i;j<=K;++j){
  27. f[i][j]=(f[i][j-i]-f[i-1][j-i]+mod)%mod;
  28. if(j>=n+1)inc(f[i][j],f[i-1][j-n-1]);
  29. }
  30. for(int i=0;i<=K;++i)
  31. for(int j=0;j<=m;++j)inc(a[i],f[j][i]);
  32. int ans=0;
  33. for(int i=0;i<=K;++i){
  34. ll tmp=1ll*a[i]*cal(K-i+n-1,n-1)%mod;
  35. inc(ans,tmp);
  36. }
  37. cout<<ans<<endl;
  38. return 0;
  39. }
  1. //sol 1
  2. #include<bits/stdc++.h>
  3. #define ll long long
  4. #define ld long double
  5. #define il inline
  6. #define rg register
  7. using namespace std;
  8. const int N=1<<20,all=(1<<15)-1,mod=1e9+7;
  9. const ld pi=acos(-1);
  10. int n,K,ny[N],fac[N],inv[N],a[N],b[N],c[N],lst=-1;
  11. il void inc(int&x,int y){x+=y;if(x>=mod)x-=mod;}
  12. il void dec(int&x,int y){x-=y;if(x<0)x+=mod;}
  13. il int cal(int x,int y){return x<y?0:(ll)fac[x]*inv[y]%mod*inv[x-y]%mod;}
  14. struct C{
  15. ld x,y;
  16. C(ld _x=0,ld _y=0):x(_x),y(_y){};
  17. C operator +(const C&A){return C(x+A.x,y+A.y);}
  18. C operator -(const C&A){return C(x-A.x,y-A.y);}
  19. C operator *(const C&A){return C(x*A.x-y*A.y,x*A.y+y*A.x);}
  20. C operator /(const ld&A){return C(x/A,y/A);}
  21. C operator !(){return C(x,-y);}
  22. }Wn[2][N];
  23. namespace poly{
  24. int rev[N],L;
  25. il void init(int l){
  26. for(rg int i=1;i<l;i<<=1){
  27. Wn[0][i]=C(cos(pi/i),sin(pi/i));
  28. Wn[1][i]=!Wn[0][i];
  29. }
  30. }
  31. il void fft(C*A,int l,int f){
  32. for(L=0;(1<<L)<l;++L);
  33. for(rg int i=0;i<l;++i){
  34. rev[i]=(rev[i>>1]>>1)|((i&1)<<(L-1));
  35. if(i<rev[i])swap(A[i],A[rev[i]]);
  36. }
  37. for(rg int i=1;i<l;i<<=1){
  38. C wn=Wn[!~f][i];
  39. for(rg int j=0;j<l;j+=i<<1){
  40. C w(1,0);
  41. for(rg int k=0;k<i;++k,w=w*wn){
  42. C x=A[j+k],y=w*A[j+k+i];
  43. A[j+k]=x+y,A[j+k+i]=x-y;
  44. }
  45. }
  46. }
  47. if(!~f)for(int i=0;i<l;++i)A[i]=A[i]/l;
  48. }
  49. il void mtt(int*A,int*B,int l){
  50. static C t1[N],t2[N],t3[N],t4[N];
  51. for(rg int i=0;i<l;++i){
  52. t1[i]=C(A[i]&all,A[i]>>15);
  53. t2[i]=C(B[i]&all,B[i]>>15);
  54. }
  55. fft(t1,l,1),fft(t2,l,1);
  56. for(rg int i=0;i<l;++i){
  57. C x1=t1[i],y1=!t1[(l-i)&(l-1)];
  58. C x2=t2[i];
  59. t3[i]=(x1+y1)*x2*C(0.5,0);
  60. t4[i]=(x1-y1)*x2*C(0,-0.5);
  61. }
  62. fft(t3,l,-1),fft(t4,l,-1);
  63. for(rg int i=0;i<l;++i){
  64. A[i]=(
  65. (ll)(t3[i].x+0.1)%mod
  66. +( (ll)(t3[i].y+t4[i].x+0.1)%mod<<15)
  67. +( (ll)(t4[i].y+0.1)%mod<<30)
  68. )%mod;
  69. }
  70. }
  71. il void cpy(int*A,int*B,int l){for(rg int i=0;i<l;++i)A[i]=B[i];}
  72. il void clr(int*A,int l,int r){for(rg int i=l;i<r;++i)A[i]=0;}
  73. il void dif(int*A,int l){for(rg int i=0;i<l-1;++i)A[i]=(ll)(i+1)*A[i+1]%mod;A[l-1]=0;}
  74. il void der(int*A,int l){for(rg int i=l-1;i;--i)A[i]=(ll)ny[i]*A[i-1]%mod;A[0]=0;}
  75. void inv(int*A,int*B,int l){
  76. if(l==1){B[0]=1;return;}
  77. static int t1[N];
  78. inv(A,B,l>>1);
  79. int len=l<<1;
  80. cpy(t1,A,l),clr(t1,l,len);
  81. clr(B,l,len);
  82. mtt(t1,B,len);//clr(t1,l,len);
  83. mtt(t1,B,len);//clr(t1,l,len);
  84. for(rg int i=0;i<l;++i)B[i]=(2ll*B[i]-t1[i]+mod)%mod;
  85. //clr(B,l,len);
  86. }
  87. void ln(int*A,int*B,int l){
  88. static int t1[N];
  89. int len=l<<1;
  90. cpy(t1,A,l),clr(t1,l,len),dif(t1,l);
  91. inv(A,B,l);
  92. mtt(B,t1,len);
  93. der(B,l),clr(B,l,len);
  94. }
  95. void exp(int*A,int*B,int l){
  96. if(l==1){B[0]=1;return;}
  97. static int t1[N];
  98. exp(A,B,l>>1);
  99. int len=l<<1;
  100. ln(B,t1,l);
  101. for(rg int i=0;i<l;++i)t1[i]=(A[i]-t1[i]+mod)%mod;
  102. inc(t1[0],1);
  103. mtt(B,t1,len),clr(B,l,len);
  104. }
  105. }
  106. int main(){
  107. freopen("b.in","r",stdin);
  108. freopen("b3.out","w",stdout);
  109. scanf("%d%d",&n,&K);
  110. int len=1;while(len<=K)len<<=1;
  111. int mx=max(n+K,len<<1);
  112. ny[1]=1;for(rg int i=2;i<=mx;++i)
  113. ny[i]=(ll)(mod-mod/i)*ny[mod%i]%mod;
  114. for(rg int i=inv[0]=fac[0]=1;i<=n+K;++i){
  115. inv[i]=1ll*inv[i-1]*ny[i]%mod;
  116. fac[i]=1ll*fac[i-1]*i%mod;
  117. }
  118. for(rg int i=1;i<=n;++i)
  119. for(rg int j=1;j<=K/i;++j)dec(a[i*j],ny[j]);
  120. poly::init(len<<1);
  121. poly::exp(a,b,len);
  122. int ans=0;
  123. for(rg int i=0;i<=K;++i){
  124. inc(ans,1ll*b[i]*cal(n+K-i-1,K-i)%mod);
  125. }
  126. cout<<ans<<endl;
  127. return 0;
  128. }//
  129. //卡不过去....
  130. //20190704

【JZOJ6246】【20190627】B的更多相关文章

  1. 【疯狂造轮子-iOS】JSON转Model系列之二

    [疯狂造轮子-iOS]JSON转Model系列之二 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇<[疯狂造轮子-iOS]JSON转Model系列之一> ...

  2. 【疯狂造轮子-iOS】JSON转Model系列之一

    [疯狂造轮子-iOS]JSON转Model系列之一 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 之前一直看别人的源码,虽然对自己提升比较大,但毕竟不是自己写的,很容易遗 ...

  3. 【原创分享·支付宝支付】HBuilder打包APP调用支付宝客户端支付

    前言 最近有点空余时间,所以,就研究了一下APP支付.前面很早就搞完APP的微信支付了,但是由于时间上和应用上的情况,支付宝一直没空去研究.然后等我空了的时候,发现支付宝居然升级了支付逻辑,虽然目前还 ...

  4. 【AutoMapper官方文档】DTO与Domin Model相互转换(上)

    写在前面 AutoMapper目录: [AutoMapper官方文档]DTO与Domin Model相互转换(上) [AutoMapper官方文档]DTO与Domin Model相互转换(中) [Au ...

  5. 【Win 10 应用开发】应用预启动

    所谓预启动,其实你一看那名字就知道是啥意思了,这是直接译,也找不到比这个叫法更简练的词了.在系统资源允许的情况下(比如电池电量充足,有足够的内存空间),系统会把用户常用的应用程序在后台启动,但不会显示 ...

  6. 【Win 10 应用开发】启动远程设备上的应用

    这个功能必须在“红石-1”(build 14393)以上的系统版中才能使用,运行在一台设备上的应用,可以通过URI来启动另一台设备上的应用.激活远程应用需要以下前提: 系统必须是build 14393 ...

  7. 【开源】分享2011-2015年全国城市历史天气数据库【Sqlite+C#访问程序】

    由于个人研究需要,需要采集天气历史数据,前一篇文章:C#+HtmlAgilityPack+XPath带你采集数据(以采集天气数据为例子),介绍了基本的采集思路和核心代码,经过1个星期的采集,历史数据库 ...

  8. 【原创分享·微信支付】C# MVC 微信支付教程系列之现金红包

            微信支付教程系列之现金红包           最近最弄这个微信支付的功能,然后扫码.公众号支付,这些都做了,闲着无聊,就看了看微信支付的其他功能,发现还有一个叫“现金红包”的玩意,想 ...

  9. 【原创分享·微信支付】 C# MVC 微信支付教程系列之扫码支付

    微信支付教程系列之扫码支付                  今天,我们来一起探讨一下这个微信扫码支付.何为扫码支付呢?这里面,扫的码就是二维码了,就是我们经常扫一扫的那种二维码图片,例如,我们自己添 ...

  10. 【原创分享·微信支付】 C# MVC 微信支付教程系列之公众号支付

    微信支付教程系列之公众号支付         今天,我们接着讲微信支付的系列教程,前面,我们讲了这个微信红包和扫码支付.现在,我们讲讲这个公众号支付.公众号支付的应用环境常见的用户通过公众号,然后再通 ...

随机推荐

  1. Java链表操作代码

    /** * */ package com.cherish.SwordRefersToOffer; /** * @author acer * */ public class test_22链表中倒数第k ...

  2. Space Syntax(空间句法)

    01 December 2019 13:16     https://spacesyntax.com/     相关软件:Depthmap     空间句法理论作为一种新的描述建筑和城市空间模式的语言 ...

  3. Docker Cheatsheet

    一.创建 docker create:创建容器,处于停止状态. centos:latest:centos容器:最新版本(也可以指定具体的版本号).本地有就使用本地镜像,没有则从远程镜像库拉取.创建成功 ...

  4. Eclipse集成Git做团队开发:代码管理

    在日常开发工作中,我们通常使用版本控制软件管理团队的源代码,常用的SVN.Git.与SVN相比,Git有分支的概念,可以从主分支创建开发分支,在开发分支测试没有问题之后,再合并到主分支上去,从而避免了 ...

  5. 文件的读取(txt文件)

    一.将读取文件夹内容,变为字典保存,代码如下: def read_class_names(class_file_name): '''loads class name from a file''' na ...

  6. 题解 POJ 2559【Largest Rectangle in a Histogram】(单调栈)

    题目链接:http://poj.org/problem?id=2559 思路:单调栈 什么是单调栈? 单调栈,顾名思义,就是单调的栈,也就是占中存的东西永远是单调(也就是递增或递减)的 如何实现一个单 ...

  7. 简要介绍Linux网络服务的种类

    如果有人问你Linux最强大的功能是什么,你大概会回答“是网络功能”.Lmux操作系统的优势之一就是网络功能了,这包含比较稳定的系统资源分配,以及较为安全的网络防护能力,所以许多人都喜欢用它来进行网络 ...

  8. cmd脚本

    管道命令 | |命令的作用,就是让前一命令的输出当做后一命令的输入. > >会清除掉原有文件中的内容后把新的内容写入原文件: echo @echo off > a.bat. > ...

  9. Android studio module生成jar包,module中引用的第三方库没有被引用,导致java.lang.NoClassDefFoundError错误。

    android studio 创建了一个Module生成jar包,这个module中有引用一些第三方的类库,比如 gson,volley等. 但是生成的jar包里,并没有将gson,volley等第三 ...

  10. Spark基于自定义聚合函数实现【列转行、行转列】

    一.分析 Spark提供了非常丰富的算子,可以实现大部分的逻辑处理,例如,要实现行转列,可以用hiveContext中支持的concat_ws(',', collect_set('字段'))实现.但是 ...