bzoj1485

http://www.lydsy.com/JudgeOnline/problem.php?id=1485

卡特兰数。

把第1,3,...,2N-1个位置看做左括号,第2,4,...,2N个位置看成右括号。

考虑从1到2N把数放进去,其实就变成了括号序列。

所以是卡特兰数。

求$\frac{C_{2n}^{n}}{n+1}\%P$可以看我下一篇博客。

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<fstream>
#include<algorithm>
#include<cstring>
#include<string>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<utility>
#include<set>
#include<bitset>
#include<vector>
#include<functional>
#include<deque>
#include<cctype>
#include<climits>
#include<complex>
//#include<bits/stdc++.h>适用于CF,UOJ,但不适用于poj

using namespace std;

typedef long long LL;
typedef double DB;
typedef pair<int,int> PII;
typedef complex<DB> CP;

#define mmst(a,v) memset(a,v,sizeof(a))
#define mmcy(a,b) memcpy(a,b,sizeof(a))
#define fill(a,l,r,v) fill(a+l,a+r+1,v)
#define re(i,a,b)  for(i=(a);i<=(b);i++)
#define red(i,a,b) for(i=(a);i>=(b);i--)
#define ire(i,x) for(typedef(x.begin()) i=x.begin();i!=x.end();i++)
#define fi first
#define se second
#define m_p(a,b) make_pair(a,b)
#define SF scanf
#define PF printf
#define two(k) (1<<(k))

template<class T>inline T sqr(T x){return x*x;}
template<class T>inline void upmin(T &t,T tmp){if(t>tmp)t=tmp;}
template<class T>inline void upmax(T &t,T tmp){if(t<tmp)t=tmp;}

const DB EPS=1e-9;
inline int sgn(DB x){if(abs(x)<EPS)return 0;return(x>0)?1:-1;}
const DB Pi=acos(-1.0);

inline int gint()
  {
        int res=0;bool neg=0;char z;
        for(z=getchar();z!=EOF && z!=‘-‘ && !isdigit(z);z=getchar());
        if(z==EOF)return 0;
        if(z==‘-‘){neg=1;z=getchar();}
        for(;z!=EOF && isdigit(z);res=res*10+z-‘0‘,z=getchar());
        return (neg)?-res:res;
    }
inline LL gll()
  {
      LL res=0;bool neg=0;char z;
        for(z=getchar();z!=EOF && z!=‘-‘ && !isdigit(z);z=getchar());
        if(z==EOF)return 0;
        if(z==‘-‘){neg=1;z=getchar();}
        for(;z!=EOF && isdigit(z);res=res*10+z-‘0‘,z=getchar());
        return (neg)?-res:res;
  }

const int maxN=2000000;

int N;LL P;
LL ans;

inline LL power(LL a,LL k){LL x=1,y=a;while(k){if(k&1)x=x*y%P;k>>=1;y=y*y%P;}return x;}

int flag[maxN+100],cnt,prime[maxN+100];
int a[maxN+100];
LL b[maxN+100];

int main()
  {
      freopen("bzoj1485.in","r",stdin);
        freopen("bzoj1485.out","w",stdout);
        int i,j;
        cin>>N>>P;
        re(i,2,2*N)
          {
              if(!flag[i])prime[++cnt]=i;
              for(j=1;j<=cnt && i*prime[j]<=2*N;j++)
                {
                    flag[i*prime[j]]=1;
                    a[i*prime[j]]=prime[j];
                    if(i%prime[j]==0)break;
                }
          }
        re(i,2,N)b[i]=-1;
        re(i,N+2,2*N)b[i]=1;
        ans=1;
        red(i,2*N,2)
          if(!flag[i])
            ans=ans*power(LL(i),b[i])%P;
          else
            b[a[i]]+=b[i],b[i/a[i]]+=b[i];
        cout<<ans<<endl;
        return 0;
    }

时间: 2024-11-03 03:45:08

bzoj1485的相关文章

bzoj1485 [HNOI2009]有趣的数列 卡特兰数

[bzoj1485][HNOI2009]有趣的数列 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的有趣的数列.因为

「BZOJ1485」[HNOI2009] 有趣的数列 卡特兰数列

「BZOJ1485」[HNOI2009] 有趣的数列   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的有趣的数列

[bzoj1485] [HNOI2009]有趣的数列

找规律题... 首先观察样例解释可得.我们只要确定奇数位的情况就行了,并且只要i<=第i个奇数<=2*i-1就是合法的= = 然后我就一直在找规律.................. 最后弃疗跑去看题解....才发现答案不就是卡特兰数吗..为啥我看半天都没看出来= = 由搜索引擎可得,h(n)=C(2*n,n)/(n+1)...求组合数的话我写了分解质因数... 顺便学(chao)习(xi)了一下黄学长的分解质因数..我以前写的都是什么鬼QAQ 写了个快速幂竟然比直接乘慢orz 1 #incl

bzoj1485:[HNOI2009]有趣的数列

思路:首先限制数很多,逐步来考虑,限制一很容易满足,考虑限制二,也就是让奇数位和偶数位上的数递增,限制三就是让奇数位上的数小于奇数位加一对应的偶数位上的数,那么我们可以把形成序列的过程看成加数的过程,从小到大逐步加(这显然满足限制一),然后加数的条件一是从小到大依次放奇数位或偶数位,因此也满足限制二,然后无论何时奇数位上的数一定要大于等于偶数位上的数,这样也满足了限制三,那么问题就转化成了按照如上条件放数的方案数,联系第二个条件,也就是无论何时奇数位上的数一定要大于等于偶数位上的数,联想到了什么

BZOJ1485 有趣的数列

题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1485 首先有一个显而易见的结论: 对于任意的 $a(i)$ ($i$为偶数) 有 $a(i) > a(j) (0<j<i)$ 然后有 $a(i) > 2 \cdot i$ (只考虑选出n个偶数项) $f[i][j]$ 表示前$i$个,最大的数为 $j$ 的方案数,然后 $O(n^2)$ TLE 打表发现是catalan数,然后就没有然后了. 将$n!$的质因数分解然后计算$C(

【卡特兰数】BZOJ1485: [HNOI2009]有趣的数列

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的

带除法的取模运算

type1 $\frac{x}{y}\%P,其中P是大质数$ 用费马小小定理得: $y^{P-1}\equiv 1(mod P)$ 故: $\frac{x}{y}\%P=\frac{x*y^{P-1}}{y}\%P=x*y^{P-2}\%P$ type2 $\frac{x}{y}\%P,其中x和y可分解质因数$ 我们还是用一些例子来讲比较好一些. 求卡特兰数$\frac{C_{2n}^{n}}{n+1}\%P$ $\frac{C_{2n}^{n}}{n+1}\%P$ $=\frac{(n+2)\

[转载]hzwer的bzoj题单

counter: 664BZOJ1601 BZOJ1003 BZOJ1002 BZOJ1192 BZOJ1303 BZOJ1270 BZOJ3039 BZOJ1191 BZOJ1059 BZOJ1202 BZOJ1051 BZOJ1001 BZOJ1588 BZOJ1208 BZOJ1491 BZOJ1084 BZOJ1295 BZOJ3109 BZOJ1085 BZOJ1041 BZOJ1087 BZOJ3038 BZOJ1821 BZOJ1076 BZOJ2321 BZOJ1934 BZOJ

bzoj 1485 有趣的数列

传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=1485 [题解] Catalan数,注意不能直接用逆元,需要分解质因数. 1 # include <bits/stdc++.h> 2 using namespace std; 3 4 const int M = 5e5 + 10, N = 2e6 + 10; 5 6 int isp[N]; 7 int p[M], pn; 8 int n, mod; 9 int times[M]; 10