bzoj1485 [HNOI2009]有趣的数列
2017-09-15 15:42
369 查看
Description
我们称一个长度为2n的数列是有趣的,当且仅当该数列满足以下三个条件:(1)它是从1到2n共2n个整数的一个排列{ai};
(2)所有的奇数项满足a1<a3<…<a2n-1,所有的偶数项满足a2<a4<…<a2n;
(3)任意相邻的两项a2i-1与a2i(1≤i≤n)满足奇数项小于偶数项,即:a2i-1<a2i。
现在的任务是:对于给定的n,请求出有多少个不同的长度为2n的有趣的数列。因为最后的答案可能很大,所以只要求输出答案 mod P的值。
Input
输入文件只包含用空格隔开的两个整数n和P。输入数据保证,50%的数据满足n≤1000,100%的数据满足n≤1000000且P≤1000000000。Output
仅含一个整数,表示不同的长度为2n的有趣的数列个数mod P的值。Sample Input
3 10Sample Output
5对应的5个有趣的数列分别为(1,2,3,4,5,6),(1,2,3,5,4,6),(1,3,2,4,5,6),(1,3,2,5,4,6),(1,4,2,5,3,6)。
正解:卡特兰数。
打表以后发现是卡特兰数,然后直接分解质因数求组合数就行了。
#include <bits/stdc++.h> #define il inline #define RG register #define ll long long #define N (1000010) using namespace std; int prime ,num ,n,p,cnt,phi,inv,ans; il int qpow(RG int a,RG int b){ RG int ans=1; while (b){ if (b&1) ans=1LL*ans*a%p; a=1LL*a*a%p,b>>=1; } return ans; } il void divide(RG int n){ phi=n; for (RG int i=2;i*i<=n;++i){ if (n%i) continue; while (n%i==0) n/=i; prime[++cnt]=i,phi=phi/i*(i-1); } if (n!=1) prime[++cnt]=n,phi=phi/n*(n-1); return; } il void get(RG int n,RG int v){ for (RG int i=1;i<=n;++i){ RG int x=i; for (RG int j=1;j<=cnt;++j){ if (x%prime[j]) continue; while (x%prime[j]==0) num[j]+=v,x/=prime[j]; } if (v==1) ans=1LL*ans*x%p; else inv=1LL*inv*x%p; } } int main(){ #ifndef ONLINE_JUDGE freopen("sequence.in","r",stdin); freopen("sequence.out","w",stdout); #endif cin>>n>>p; divide(p),ans=inv=1; get(2*n,1),get(n,-1),get(n+1,-1); for (RG int i=1;i<=cnt;++i) ans=1LL*ans*qpow(prime[i],num[i])%p; ans=1LL*ans*qpow(inv,phi-1)%p; cout<<ans; return 0; }
相关文章推荐
- BZOJ_1485_[HNOI2009]有趣的数列_卡特兰数
- BZOJ 1485 [HNOI2009]有趣的数列 - 卡特兰数
- [bzoj1485] [HNOI2009]有趣的数列
- 数论——BZOJ1485[HNOI2009]有趣的数列
- 有趣的数列 [Codevs 2337,Bzoj 1485,HNOI2009]
- [BZOJ1485] [HNOI2009]有趣的数列 && 找规律 + 数学
- Bzoj1485 有趣的数列[HNOI2009]
- 【BZOJ 1485】[HNOI2009]有趣的数列 卡特兰数
- bzoj1485: [HNOI2009]有趣的数列
- BZOJ 1485: [HNOI2009]有趣的数列 卡特兰数
- bzoj1485: [HNOI2009]有趣的数列 卡特兰数
- 【BZOJ】1485: [HNOI2009]有趣的数列
- BZOJ 1485: [HNOI2009]有趣的数列
- bzoj1485 [HNOI2009]有趣的数列(Catalan)
- bzoj1485 [HNOI2009]有趣的数列 ( 组合数 + 卡特兰数)
- bzoj1485:[HNOI2009]有趣的数列
- bzoj1485 [HNOI2009]有趣的数列
- [bzoj1485][HNOI2009]有趣的数列(Catalan)
- 【卡特兰数】BZOJ1485: [HNOI2009]有趣的数列
- bzoj1485: [HNOI2009]有趣的数列