NTT【51nod】1514 美妙的序列
题意:1~n 的全排列中,有多少个排列满足任意从中间切成两段后,左边段的最大值大于右边段的最小值?
例如:n为3时有3种
2 3 1
3 1 2
3 2 1
解释:比如 2 3 1
(2) (3 1) 1比2小
(2 3) (1) 1比2小
都满足上面的条件。
3 2 1
(3)(2 1) 1比3小
(32)(1) 1比3小
都满足上面的条件。
而2 1 3不满足,因为(2 1)(3),3比左边所有的数都大。
====================================分割线====================================
首先序列为美妙的等价于不存在(1<=i<n)使得 前i个数为1~i的排列
令f[n]为长度为n的答案
则:
f[0]=0
f[i]=i!-sigma(f[j]*(i-j)!) 0<=j<i
我们将其变形
Sigma(f[j]*(i-j)!) = i! i > 0, j=0~i
Sigma(f[j]*(i-j)!) = 0 i = 0, j=0~i
令G(x)=sigma(i!*x^i),F(x)=sigma(f[i]*x^i)
F(x)*G(x)=G(x)-1 (减一为i = 0的情况)
F(x)=(G(x)-1)/G(x)=1-1/G(x)
多项式求逆即可
#include<cstdio>
#include<iostream>
typedef long long ll;
using namespace std;
const int N = , K = ;
int n, m, i, k;
int a[N+], b[N+], tmp[N+], tmp2[N+];
int P = , G = , g[K+], ng[K+], inv[N+], inv2;
int pow(int a,int b){int t=;for(;b;b>>=,a=(ll)a*a%P)if(b&)t=(ll)t*a%P;return t;}
void NTT(int*a,int n,int t){
for(int i=,j=;i<n-;i++){
for(int s=n;j^=s>>=,~j&s;);
if(i<j)swap(a[i], a[j]);
}
for(int d=;(<<d)<n;d++){
int m=<<d,m2=m<<,_w=t==?g[d]:ng[d];
for(int i=;i<n;i+=m2)for(int w=,j=;j<m;j++){
int&A=a[i+j+m],&B=a[i+j],t=(ll)w*A%P;
A=B-t;if(A<)A+=P;
B=B+t;if(B>=P)B-=P;
w=(ll)w*_w%P;
}
}
if(t==-)for(int i=,j=inv[n];i<n;i++)a[i]=(ll)a[i]*j%P;
}
//给定a,求a的逆元b
void getinv(int*a,int*b,int n){
if(n==){b[]=pow(a[],P-);return;}
getinv(a,b,n>>);
int k=n<<,i;
for(i=;i<n;i++)tmp[i]=a[i];
for(i=n;i<k;i++)tmp[i]=b[i]=;
NTT(tmp,k,),NTT(b,k,);
for(i=;i<k;i++){
b[i]=(ll)b[i]*(-(ll)tmp[i]*b[i]%P)%P;
if(b[i]<)b[i]+=P;
}
NTT(b,k,-);
for(i=n;i<k;i++)b[i]=;
}
int main(){
for(g[K]=pow(G,(P-)/N),ng[K]=pow(g[K],P-),i=K-;~i;i--)
g[i]=(ll)g[i+]*g[i+]%P,ng[i]=(ll)ng[i+]*ng[i+]%P;
for(inv[]=,i=;i<=N;i++)inv[i]=(ll)(P-inv[P%i])*(P/i)%P;inv2=inv[];
int len = ;
while(len <= ) len <<= ;
a[] = ;
for(int i = ; i < len; i++)
a[i] = (ll)i*a[i-]%P;
getinv(a, b, len);
for(int i = ; i < len; i++)
b[i] = (-b[i]+P)%P;
b[]++;
int t, n; scanf("%d", &t);
while(t--){
scanf("%d", &n);
printf("%d\n", b[n]);
}
return ;
}
NTT【51nod】1514 美妙的序列的更多相关文章
- 51nod 1514 美妙的序列 分治NTT + 容斥
Code: #include<bits/stdc++.h> #define ll long long #define mod 998244353 #define maxn 400000 # ...
- 51nod 1514 美妙的序列
Description 长度为n的排列,且满足从中间任意位置划分为两个非空数列后,左边的最大值>右边的最小值.问这样的排列有多少个%998244353 题面 Solution 正难则反 \(f[ ...
- Solution -「51nod 1514」美妙的序列
\(\mathcal{Description}\) Link. 称排列 \(\{p_n\}\) 美妙,当且仅当 \((\forall i\in[1,n))(\max_{j\in[1,i]}\{ ...
- [51nod1514] 美妙的序列
Description 如果对于一个 \(1\sim n\) 的排列满足: 在 \(1\sim n-1\) 这些位置之后将序列断开,使得总可以从右边找一个数,使得该数不会比左边所有数都大,则称该序列是 ...
- 【51nod 1514】 美妙的序列
题目 我们发现我们得正难则反 还是设\(f_i\)表示长度为\(i\)的序列个数 考虑容斥 \[f_i=i!-\sum_{j=1}^{i-1}f_j(i-j)!\] \(i!\)显然是总方案数,我们减 ...
- FFT/NTT [51Nod 1028] 大数乘法 V2
题目链接:51Nod 传送门 没压位,效率会低一点 1.FFT #include <cstdio> #include <cstring> #include <algori ...
- 51nod 1510 最小化序列 | DP 贪心
题目描述 现在有一个长度为n的数组A,另外还有一个整数k.数组下标从1开始. 现在你需要把数组的顺序重新排列一下使得下面这个的式子的值尽可能小. ∑|A[i]−A[i+k]| 特别的,你也可以不对数组 ...
- 【51nod】1251 Fox序列的数量
题解 容斥题 我们枚举出现次数最多的数出现了K次 然后我们需要计算的序列是所有数字出现个数都不超过K - 1次 我们枚举不合法的数字的数目j,说明这个排列里除了我们固定出现K次的数至少有j个数是不合法 ...
- 【51nod 1251】 Fox序列的数量(以及带限制插板法讲解)
为什么网上没有篇详细的题解[雾 可能各位聚聚觉得这道题太简单了吧 /kk 题意 首先题目是求满足条件的序列个数,条件为:出现次数最多的数仅有一个 分析 感谢 刚睡醒的 JZ姐姐在咱写题解忽然陷入自闭的 ...
随机推荐
- Hadoop Balance
一.hadoop balance工具的用法: 启动balance: bin/start-balancer.sh -threshold 5 停止balance: bin/stop-balancer.sh ...
- linux下对sh文件的操作
1.创建test.sh文件 touch test.sh 2.编辑sh文件 vi test.sh(i:插入 | esc:退出insert模式 | wq+回车:退出) 3.保存退出 敲击esc, 然后输入 ...
- Spring集成memcached的详细介绍
前提条件:工程需要引入jar包java_memcached-release_2.0.1.jar 第一步:添加memcached的配置文件. <bean class="org.sprin ...
- PullToRefresh 下拉刷新的样式修改
资源文件结构图, 先看看下拉刷新头的布局, <?xml version="1.0" encoding="utf-8"?> <merge xml ...
- cocos2dx资源和脚本加密quick-lua3.3final
一.资源加密 版本号:Quick-Cocos2d-x 3.3 Final 调试工具:xCode 工程创建的时候选择的拷贝源码. 项目结构如图: 这个功能七月大神在很早之前就已经实现了,但是在3.3版本 ...
- Session机制(是对cookie的作用的提升,使用较多)
1.Session作用类似于购物车,第一次,放入物品,可以获得Session的id,并可以设置id失效的时间,这样便于多次将物品放在购物车里面,使用的就是获取的Session的id: 2.Sessio ...
- A Simple Problem with Integers(树状数组HDU4267)
A Simple Problem with Integers Time Limit: 5000/1500 MS (Java/Others) Memory Limit: 32768/32768 K (J ...
- pandas安装过程中提示unable to find vcvarsall.bat的解决方法
转载自:http://blog.csdn.net/qq_21144699/article/details/46849561 为这位老兄点赞 原帖参考:http://stackoverflow.com/ ...
- canvas动画基础
setInterval( function(){ render( context ); update(); } , ); window.requestAnimFrame = (function() { ...
- 2016年6月25日 星期六 --出埃及记 Exodus 14:22
2016年6月25日 星期六 --出埃及记 Exodus 14:22 and the Israelites went through the sea on dry ground, with a wal ...