正题

题目链接:https://ac.nowcoder.com/acm/contest/11260/C


题目大意

一个平面上,\(n\)个起点\((0,a_i)\)分别对应终点\((i,0)\),每次只能往上或者往左走。求不交路径数。

\(1\leq n\leq 5\times 10^5,a_i<a_{i+1},a_n\leq 10^6\)


解题思路

看起来很\(LGV\)引理,先列出行列式

\[F_{i,j}=\binom{a_i+i+1}{i}=\frac{(a_i+i+1)!}{(a_i+1)!(i+1)!}
\]

然后提出\(\prod \frac{(a_i+1)!^2}{(a_i+1)!(i+1)!}\)

然后范德蒙德行列式化简就变成

\[\prod_{i=1}^n(a_i+1)!\times \prod_{i=1}^n\frac{1}{j!}\prod_{i<j}(a_i-a_j)
\]

然后后面那个跑\(NTT\)看所有结论就好了。

时间复杂度\(O(a_n\log a_n)\)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const ll M=1e6+1,N=4e6+10,P=998244353;
ll T,n,m,a[510000],F[N],G[N],r[N];
ll power(ll x,ll b){
ll ans=1;
while(b){
if(b&1)ans=ans*x%P;
x=x*x%P;b>>=1;
}
return ans;
}
//ll dec(ll n){
// ll ans=1,f=1;
// for(ll i=1;i<=n;i++){
// for(ll j=i;j<=n;j++){
// if(a[j][i]){
// if(j!=i)swap(a[i],a[j]),f=-f;
// break;
// }
// }
// ans=ans*a[i][i]%P;
// ll inv=power(a[i][i],P-2);
// for(ll j=i;j<=n;j++)a[i][j]=a[i][j]*inv%P;
// for(ll j=i+1;j<=n;j++){
// ll rate=P-a[j][i];
// for(ll k=i;k<=n;k++)
// (a[j][k]+=rate*a[i][k]%P)%=P;
// }
// }
// return ans;
//}
void NTT(ll *f,ll n,ll op){
for(ll i=0;i<n;i++)
if(i<r[i])swap(f[i],f[r[i]]);
for(ll p=2;p<=n;p<<=1){
ll len=p>>1,tmp=power(3,(P-1)/p);
if(op==-1)tmp=power(tmp,P-2);
for(ll k=0;k<n;k+=p){
ll buf=1;
for(ll i=k;i<k+len;i++){
ll tt=f[i+len]*buf%P;
f[i+len]=(f[i]-tt+P)%P;
f[i]=(f[i]+tt)%P;
buf=buf*tmp%P;
}
}
}
if(op==-1){
ll invn=power(n,P-2);
for(ll i=0;i<n;i++)
f[i]=f[i]*invn%P;
}
return;
}
signed main()
{
scanf("%lld",&n);ll ans=1;
for(ll i=1,z=1;i<=n;i++,z=z*i%P){
scanf("%lld",&a[i]);
ans=ans*(a[i]+1)%P*power(z,P-2)%P;
F[a[i]]++;G[M-a[i]]++;
}
ll m=1;while(m<=2*M)m<<=1;
for(ll i=0;i<m;i++)r[i]=(r[i>>1]>>1)|((i&1)?(m>>1):0);
NTT(F,m,1);NTT(G,m,1);
for(ll i=0;i<m;i++)F[i]=F[i]*G[i]%P;
NTT(F,m,-1);
for(ll i=1;i<m;i++)
ans=ans*power(i,F[M+i])%P;
printf("%lld\n",ans);
return 0;
}

2021牛客暑期多校训练营9C-Cells【LGV引理,范德蒙德行列式】的更多相关文章

  1. 2021牛客暑期多校训练营3 J 思维

    传送门 J-Counting Triangles_2021牛客暑期多校训练营3 (nowcoder.com) 题目 Goodeat finds an undirected complete graph ...

  2. 2019牛客暑期多校训练营(第五场)G - subsequeue 1 (一题我真的不会的题)

    layout: post title: 2019牛客暑期多校训练营(第五场)G - subsequeue 1 (一题我真的不会的题) author: "luowentaoaa" c ...

  3. B-xor_2019牛客暑期多校训练营(第四场)

    题意 给出n个数组(每组数个数不定),m个询问 l, r, x 序号在区间\([l,r]\)的每个数组是否都可以取出任意个数异或出x 题解 判断一个数组能否异或出x,是简单的线性基问题 判断多个线性基 ...

  4. 2019牛客暑期多校训练营(第九场)A:Power of Fibonacci(斐波拉契幂次和)

    题意:求Σfi^m%p. zoj上p是1e9+7,牛客是1e9:  对于这两个,分别有不同的做法. 前者利用公式,公式里面有sqrt(5),我们只需要二次剩余求即可.     后者mod=1e9,5才 ...

  5. 2019牛客暑期多校训练营(第一场)A题【单调栈】(补题)

    链接:https://ac.nowcoder.com/acm/contest/881/A来源:牛客网 题目描述 Two arrays u and v each with m distinct elem ...

  6. 2019牛客暑期多校训练营(第一场) B Integration (数学)

    链接:https://ac.nowcoder.com/acm/contest/881/B 来源:牛客网 Integration 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 5242 ...

  7. 2019牛客暑期多校训练营(第一场) A Equivalent Prefixes ( st 表 + 二分+分治)

    链接:https://ac.nowcoder.com/acm/contest/881/A 来源:牛客网 Equivalent Prefixes 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/ ...

  8. 2019牛客暑期多校训练营(第二场)F.Partition problem

    链接:https://ac.nowcoder.com/acm/contest/882/F来源:牛客网 Given 2N people, you need to assign each of them ...

  9. 2019牛客暑期多校训练营(第八场)E.Explorer

    链接:https://ac.nowcoder.com/acm/contest/888/E来源:牛客网 Gromah and LZR have entered the fifth level. Unli ...

随机推荐

  1. ReentrantLock中的Condition(等待和唤醒)

    Condition 类的 awiat 方法和 Object 类的 wait 方法等效 Condition 类的 signal 方法和 Object 类的 notify 方法等效 Condition 类 ...

  2. Docker运行sonarqube-(代码质量检测平台)

    sonarqube是什么 SonarQube是用于持续检查代码质量的开源平台. 可用于持续集成,持续部署流程中的代码检测环节. idea和jenkins都提供了插件配合使用. liunx推荐配置环境 ...

  3. 如何在HTML中实现图片的滚动效果

    <MARQUEE onmouseover=stop() onmouseout=start() scrollAmount=3 loop=infinite deplay="0"& ...

  4. 《深入浅出vue.js》阅读笔记之(object)变化侦测

    1.什么是变化侦测? 通常,在运行时应用内部的状态会不断发生变化,此时需要不停地重新渲染页面,这时如何确定状态中发生了什么变化? 变化侦测就是用来解决这个问题的,它分为两种类型,一种是"推& ...

  5. C#的6种常用集合类

    一.先来说说数组的不足(也可以说集合与数组的区别): 1.数组是固定大小的,不能伸缩.虽然System.Array.Resize这个泛型方法可以重置数组大小,但是该方法是重新创建新设置大小的数组,用的 ...

  6. JavaWeb学习总结—Session

    转载自:https://www.cnblogs.com/xdp-gacl/p/3855702.html 一.Session简单介绍 在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(sess ...

  7. Linux centos 安装 Node.js

    官网下载地址 https://nodejs.org/zh-cn/download/ 1.下载二进制文件 (x64)   相当于  https://nodejs.org/dist/v10.16.3/no ...

  8. 了解Prometheus

    了解Prometheus 标签(空格分隔): 监控 介绍 Prometheus是用来收集和存储服务器的实时数据(比如:CPU.硬盘.服务响应.日志等),通过其丰富的运算函数,可以计算得到很多的服务性能 ...

  9. tensorflow1.12 queue 笔记

    主要参考:https://www.tensorflow.org/api_guides/python/threading_and_queues#Queue_usage_overview 自动方式 For ...

  10. 四种cmd打开方式

    四种cmd打开方式: 开始+系统+命令提示符: Win+R 输入cmd回车(推荐使用): 按住shift键加右键,点击打开PowerShell窗口: 资源管理器的地址栏前加入cmd+空格