微积分基础知识

       微积分基础知识

       

        前言:在信息学算法竞赛中,常有些数学类问题需用到微积分,或用到微积分的算法(如母函数,HNOI2012排队),这里本人总结了一下竞赛中常用的微积分基础知识,供大家参考,有写得不好的地方请多多包涵,感谢学长帮助修改审校,若有错误请留言告诉我,谢谢!

        辅助参考:    http://blog.csdn.net/u011400953/article/details/9325389   <普通物理中的数学基础>

                             http://blog.csdn.net/u011400953/article/details/9328067   <母函数的运用>

 

       声明:该文章为纯手打(MathType工具辅助编辑公式),由于是新手,不便讲这些公式传上来,因此用在word下的截图,图片中有部分其他符号(如:回车号),请见谅。转载注明出处〈http://blog.csdn.net/u011400953

          

————————————————————————————————————————————

       微积分基础知识_第1张图片

           

                  微积分基础知识_第2张图片

                  微积分基础知识_第3张图片

                  微积分基础知识_第4张图片

               

————————————————————————————————————————————

附:HNOI2012排队

方法:

      微积分基础知识_第5张图片

代码:

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
using namespace std;
#define MaxL 2000
const long long MOD=1000000000;
struct Bignum
{
    int len;
    long long a[MaxL];
    void init()
    {

        }
    Bignum()
    {
        len=0;
        memset(a,0,sizeof(a));
        }
};
int n,m;
Bignum ans1,ans2;
void operator *= (Bignum &p,int x)
{
    int tmp=0;
    for (int i=1;i<=p.len;++i)
    {
        p.a[i]=p.a[i]*x+tmp;
        tmp=p.a[i]/MOD;
        p.a[i]%=MOD;
        }
    if (tmp)
    p.a[++p.len]=tmp;
}
Bignum operator + (Bignum x,Bignum y)
{
    int len=max(x.len,y.len);
    int tmp=0;
    for (int i=1;i<=len;++i)
    {
        x.a[i]=x.a[i]+y.a[i]+tmp;
        tmp=x.a[i]/MOD;
        x.a[i]%=MOD;
        }
    x.len=len;
    if (tmp)
        x.a[++x.len]=tmp;
    return x;
}
Bignum operator * (Bignum x,Bignum y)
{
    Bignum p;
    p.len=0;
    for (int i=1;i<MaxL;++i)
        p.a[i]=0;
    for (int i=1;i<=x.len;++i)
    {
        int tmp=0;
        for (int j=1;j<=y.len;++j)
        {
            p.a[i+j-1]=p.a[i+j-1]+x.a[i]*y.a[j]+tmp;
            tmp=p.a[i+j-1]/MOD;
            p.a[i+j-1]%=MOD;    
            }
        if (tmp)
        p.a[i+y.len]+=tmp;
    }
    int tmp=0;
    for (int i=1;i<MaxL;++i)
    {
        p.a[i]=p.a[i]+tmp;
        tmp=p.a[i]/MOD;
        p.a[i]%=MOD;
        }
    for (int i=MaxL-1;i>=1;--i)
    if (p.a[i])
    {
        p.len=i;
        break;
        }
    if (!p.len) p.len=1;
    return p;
}
void write(Bignum p)
{
    printf("%lld",p.a[p.len]);
    for (int i=p.len-1;i>=1;--i)
    printf("%09lld",p.a[i]);
    printf("\n");
}
Bignum A(int n,int m)
{
    Bignum p;
    p.len=1;
    p.a[1]=1;
    for (int i=0;i<m;++i)
        p*=(n-i);
    return p;
}
int main()
{
    scanf("%d%d",&n,&m);
    if (n>=1 && n+3>=m)
    {
        ans1=A(n+3,m);
        ans1*=((n+1)*n);
        }
    if (m>=1 && n+3>=m)
    {
        ans2=A(n+2,m-1);
        ans2*=(2*(n+1)*m);
        }
    write(A(n,n)*(ans1+ans2));
    return 0;
}

<自己写的太烂,代码参考了http://www.cnblogs.com/evan-oi/archive/2012/05/04/2482835.html>

 

 

你可能感兴趣的:(微积分基础知识)