zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Java小案例——对字符串进行加密解密
    Java基础——使用三元运算符判断一个数的奇偶性
    Java基础——字母大小写转换
    多线程实现——新龟兔赛跑
    编程面试题之——简答题(持续更新...)
    多线程之——共享数据
    多线程之——线程的状态
    Android 8.0 Oreo介绍
    Android 7.0 Nougat介绍
    Android 6.0 Marshmallow介绍
  • 原文地址:https://www.cnblogs.com/JSZX11556/p/5001712.html
Copyright © 2011-2022 走看看