• BZOJ 1485: [HNOI2009]有趣的数列( catalan数 )


    打个表找一下规律可以发现...就是卡特兰数...卡特兰数可以用组合数计算。对于这道题,ans(n) = C(n, 2n) / (n+1) , 分解质因数去算就可以了...

    ----------------------------------------------------------------------------------

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
     
    using namespace std;
     
    typedef long long ll;
     
    const int maxn = 2000009;
     
    int N, MOD;
    int p[maxn], d[maxn], cnt[maxn], pn = 0;
    bool F[maxn];
     
    void Init() {
    memset(F, 0, sizeof F);
    for(int i = 2; i < maxn; i++) {
    if(!F[i])
    d[i] = p[pn++] = i;
    for(int j = 0; j < pn && i * p[j] < maxn; j++) {
    d[i * p[j]] = p[j];
    F[i * p[j]] = true;
    if(i % p[j] == 0) break;
    }
    }
    }
     
    int Power(int x, int t) {
    int ret = 1;
    for(; t; t >>= 1, x = ll(x) * x % MOD)
    if(t & 1) ret = ll(x) * ret % MOD;
    return ret;
    }
     
    int main() {
    Init();
    scanf("%d%d", &N, &MOD);
    for(int i = 2; i <= N; i++)
    cnt[i] = -1;
    for(int i = N + 2; i <= (N << 1); i++)
    cnt[i] = 1;
    int ans = 1;
    for(int i = (N << 1); i > 1; i--) {
    if(!F[i]) {
    ans = ll(ans) * Power(i, cnt[i]) % MOD;
    continue;
    }
    cnt[d[i]] += cnt[i];
    cnt[i / d[i]] += cnt[i];
    }
    printf("%d ", ans);
    return 0;
    }

    ----------------------------------------------------------------------------------

    1485: [HNOI2009]有趣的数列

    Time Limit: 10 Sec  Memory Limit: 64 MB
    Submit: 927  Solved: 490
    [Submit][Status][Discuss]

    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 10

    Sample 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)。

    HINT

    Source

  • 相关阅读:
    死循环(endless loop)
    while循环和do-while循环语句
    99乘法表(for循环嵌套)
    代码块和作用域
    Break语句和Continue语句
    习题两则的简化(利用for循环)
    for循环语句
    条件判断语句(if-else)
    习题两则(自增操作符和数据类型相关知识点)
    字符集、编码和字符串
  • 原文地址:https://www.cnblogs.com/JSZX11556/p/5001712.html
Copyright © 2020-2023  润新知