数学知识:逆元卡特兰数

Posted czktransformers

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数学知识:逆元卡特兰数相关的知识,希望对你有一定的参考价值。

一、逆元

递推逆元

这是别人博客上的证明,来源于:https://blog.csdn.net/rain722/article/details/53170288。

下面是ACdreamers关于递推求解逆元的推导过程(个人觉得他的更好)

 

 

其实有些题需要用到技术分享图片技术分享图片的所有逆元,这里技术分享图片为奇质数。那么如果用快速幂求时间复杂度为技术分享图片

 

如果对于一个1000000级别的素数技术分享图片,这样做的时间复杂度是很高了。实际上有技术分享图片的算法,有一个递推式如下

 

 

 

                   技术分享图片

 

 

 

它的推导过程如下,设技术分享图片,那么

 

 

 

       技术分享图片

 

 

 

对上式两边同时除技术分享图片,进一步得到

 

 

 

       技术分享图片

 

 

 

再把技术分享图片技术分享图片替换掉,最终得到

 

 

 

       技术分享图片

 

 

 

初始化技术分享图片,这样就可以通过递推法求出技术分享图片模奇素数技术分享图片的所有逆元了。

 

 

 

另外技术分享图片技术分享图片的所有逆元值对应技术分享图片中所有的数,比如技术分享图片,那么技术分享图片对应的逆元是技术分享图片

 

由此,线性筛逆元的代码诞生了:(洛谷3811 AC)

 

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
long long inv[3000004],n,modd;
void dt()
{
    inv[1]=1;
    for(long long i=2;i<=n;i++) inv[i]=((-(modd/i)*inv[modd%i])%modd+modd)%modd;
}
int main()
{
    scanf("%lld%lld",&n,&modd);
    dt();
    for(long long i=1;i<=n;i++)printf("%lld
",inv[i]);
    return 0;
} 

 

二、卡特兰数

1.简介
卡特兰数又称卡塔兰数,英文名Catalan number,是组合数学中一个常出现在各种计数问题中出现的数列。以比
利时的数学家欧仁·查理·卡塔兰 (1814–1894)的名字来命名,其前几项为 : 1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862,
16796, 58786, 208012, 742900, 2674440, 9694845, 35357670, 129644790, 477638700, 1767263190,
6564120420, 24466267020, 91482563640, 343059613650, 1289904147324, 4861946401452, ...  ————度

应用:

洛谷1044 栈

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
using namespace std;
long long ans[20];
int n;
void catelanshu(int n)
{
    long long a=0;
    for(int i=0;i<=n-1;i++)
    {
        a=a+ans[i]*ans[n-1-i];
    }
    ans[n]=a;
}
int main()
{
    ans[0]=1;ans[1]=1;
    cin>>n;
    for(int i=2;i<=n;i++)catelanshu(i);
    cout<<ans[n];
    return 0;
} 

 






以上是关于数学知识:逆元卡特兰数的主要内容,如果未能解决你的问题,请参考以下文章

解题报告 (十六) 逆元

数学知识3.2-卡特兰数

退役前的数学学习

hdu 5673 Robot 卡特兰数+逆元

HDU 4828 Grids(卡特兰数+乘法逆元)

HDU-3240(卡特兰数+分解质因数后求逆元)