zoukankan      html  css  js  c++  java
  • 【HNOI2009】有趣的数列

    题面

    https://www.luogu.org/problem/P3200

    题解

    从小到大给“奇”和“偶”的序列加数。奇的序列的长度不能超过偶的序列的长度,把加入偶序列记做写一个$($,加入奇序列记做写一个$)$,就是一个括号序列问题,所以答案是一个卡特兰数。

    要求输出第$n$个卡特兰数的值膜$p$($p$不一定是质数),我们用$H(i)=H(i-1) imes frac{4n-2}{n+1}$来算,把每个数唯一分解(乘除转加减)就行了。(记得这个$trick$还是上梵高课的时候第一次$get$到的)

    #include<cstdio>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    #define ri register int
    #define N 1000500
    using namespace std;
    
    int n,p;
    int c[N],f[4*N],prime[N];
    int ton[4*N];
    
    void add(int x) {
      while (1) {
        if (!f[x]) break;
        ton[f[x]]++;
        x/=f[x];
      }
      if (x!=1) ton[x]++;
    }
    
    void del(int x) {
      while (1) {
        if (!f[x]) break;
        ton[f[x]]--;
        x/=f[x];
      }
      if (x!=1) ton[x]--;
    }
    
    int main() {
      cin>>n>>p;
      c[1]=1;
      int cnt=0;
      for (ri i=2;i<=4*N;i++) {
        if (!f[i]) prime[++cnt]=i;
        for (ri j=1;i*prime[j]<=4*N;j++) {
          f[i*prime[j]]=prime[j];
          if (i%prime[j]==0) break;
        }
      }
      for (ri i=2;i<=n;i++) {
        add(4*i-2);
        del(i+1);
      }
      long long ans=1;
      for (ri i=1;i<=4*N;i++) while (ton[i]) ton[i]--,ans*=i,ans%=p;
      cout<<ans<<endl;
      return 0;
    }
  • 相关阅读:
    php设计模式 -- 数据映射模式
    php 守护进程 (简单)
    php 守护进程
    php rabbitmq demo
    linux 全局安装composer
    linux 安装rabbitmq
    linux php安装RabbitMq扩展
    http和tcp详解
    lnmp环境脚本自动配置
    30.输入年月日,判断它是该年的第多少天
  • 原文地址:https://www.cnblogs.com/shxnb666/p/11461082.html
Copyright © 2011-2022 走看看