zoukankan      html  css  js  c++  java
  • 【卡特兰数】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的值。

    Solution

    发现一些性质

    ①如果奇数位置的确定,偶数位置的也确定;

    ②记录奇数位置相邻“跳”过位置的个数(猎奇的表述=v=,1到3就是跳了1个位置),那么i位置已跳过的值<i,否则不合法。

    对于性质②,我们可以联想到另外一种限制模型,也就是栈。

    把奇数视为入栈,偶数视为出栈(具体的自己脑补)。

    然后就是给定入栈求出栈。

    也就是卡特兰数。

    公式为C(2n,n)/(n+1)

    Code

    好久没有写分解质因数啥的了

    自己打出来比较蠢的版本到1e6会T

    于是去膜了一下别人的代码

    这种筛法是线性的,同时可以求出每个数最小质因数

    于是为后面的质因数分解带来了方便

     1 #include<cstdio>
     2 #include<algorithm>
     3 #include<cstring>
     4 #include<cmath>
     5 #define ll long long
     6 using namespace std;
     7 const int maxn=1e6+5;
     8 
     9 int n,mod,cnt;
    10 int flag[2*maxn],prime[maxn],dy[2*maxn],tot[maxn];
    11 
    12 int getPri(){
    13     for(int i=2;i<=2*n;i++){
    14         if(!flag[i]){
    15             prime[++cnt]=i;
    16             dy[i]=cnt;
    17         }
    18         for(int j=1;prime[j]*i<=2*n&&j<=cnt;j++){
    19             flag[prime[j]*i]=1;
    20             dy[prime[j]*i]=j;
    21             if(i%prime[j]==0) break;
    22         }
    23     }
    24 }
    25 
    26 int add(int x,int k){
    27     while(x!=1){
    28         tot[dy[x]]+=k;
    29         x/=prime[dy[x]];
    30     }
    31 }
    32 
    33 int main(){
    34     scanf("%d%d",&n,&mod);
    35     getPri();
    36     
    37     for(int i=n+1;i<=2*n;i++) add(i,1);
    38     for(int i=1;i<=n;i++) add(i,-1);
    39     add(n+1,-1);
    40     
    41     ll ans=1;
    42     for(int i=1;i<=cnt;i++){
    43         while(tot[i]){
    44             ans=(ans*prime[i])%mod;
    45             tot[i]--;
    46         }
    47     }
    48     printf("%lld
    ",ans);
    49     return 0;
    50 }
  • 相关阅读:
    Android 2.2 r1 API 中文文档系列(11) —— RadioButton
    Android API 中文 (15) —— GridView
    Android 中文 API (16) —— AnalogClock
    Android2.2 API 中文文档系列(7) —— ImageButton
    Android2.2 API 中文文档系列(6) —— ImageView
    Android 2.2 r1 API 中文文档系列(12) —— Button
    Android2.2 API 中文文档系列(8) —— QuickContactBadge
    [Android1.5]TextView跑马灯效果
    [Android1.5]ActivityManager: [1] Killed am start n
    Android API 中文(14) —— ViewStub
  • 原文地址:https://www.cnblogs.com/xkui/p/4586572.html
Copyright © 2011-2022 走看看