您的位置:首页 > 其它

微积分基础知识

2013-07-15 08:12 127 查看
       微积分基础知识
       

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

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

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

 

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

          

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

       


           


                  


                  


                 


               

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

附:HNOI2012排队

方法:

     


代码:

#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>

 
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: