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

    我们转化问题为依次填数,每一次选择奇数位和偶数位填,并且奇数位的个数要大于偶数位的个数.
    设向右走代表填偶数位,向上走代表填奇数位,那么其实可以转化为从(0,0)走到(n,n)不经过对角线的方案数
    实质就是catalan数,为 (C(2n,n)/(n+1))
    注意模数不是质数,我们分解质因数后将质因子乘起来即可

    #include <algorithm>
    #include <iostream>
    #include <cstdlib>
    #include <cstring>
    #include <cstdio>
    #include <cmath>
    #define RG register
    #define il inline
    #define iter iterator
    #define Max(a,b) ((a)>(b)?(a):(b))
    #define Min(a,b) ((a)<(b)?(a):(b))
    using namespace std;
    typedef long long ll;
    const int N=2000005;
    int n,prime[N],num=0,vis[N],t[N],P,lim;
    void priwork(){
       for(int i=2;i<=lim;i++){
          if(!vis[i])prime[++num]=i,vis[i]=i;
          for(int j=1;j<=num && prime[j]*i<=lim;j++){
             vis[i*prime[j]]=prime[j];
             if(i%prime[j]==0)break;
          }
       }
    }
    void work()
    {
       scanf("%d%d",&n,&P);
       lim=n<<1;
       priwork();
       for(int i=n+2;i<=lim;i++){
          int j=i;
          while(j>1)t[vis[j]]++,j/=vis[j];
       }
       for(int i=2;i<=n;i++){
          int j=i;
          while(j>1)t[vis[j]]--,j/=vis[j];
       }
       ll ans=1;
       for(int i=2;i<=lim;i++)
          for(int j=1;j<=t[i];j++)
             ans*=i,ans%=P;
       printf("%lld
    ",ans);
    }
    
    int main()
    {
    	work();
    	return 0;
    }
    
    
  • 相关阅读:
    2. Add Two Numbers
    1. Two Sum
    leetcode 213. 打家劫舍 II JAVA
    leetcode 48. 旋转图像 java
    leetcode 45. 跳跃游戏 II JAVA
    leetcode 42. 接雨水 JAVA
    40. 组合总和 II leetcode JAVA
    24. 两两交换链表中的节点 leetcode
    1002. 查找常用字符 leecode
    leetcode 23. 合并K个排序链表 JAVA
  • 原文地址:https://www.cnblogs.com/Yuzao/p/7750688.html
Copyright © 2011-2022 走看看