数学模板

本文介绍了一系列C++编程中常用的算法和技巧,包括快速幂运算、扩展欧几里得算法、预处理逆元、预处理阶乘等,并提供了素数筛、组合数计算等实用函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


#include<iostream>
#include<cstdio>
#include<cmath>
#include<string>
#include<cstring>
#include<algorithm>
#include<set>
#include<map>
#include<list>
#include<vector>
#include<stack>
#include<queue>
#include<ctime>
#include<cstdlib>
#include<sstream>
#include<functional>
using namespace std;
#define D long long
#define F double
#define mmm(a,b) memset(a,b,sizeof(a))
D read(){ D ans=0; char last=' ',ch=getchar();
while(ch<'0' || ch>'9')last=ch,ch=getchar();
while(ch>='0' && ch<='9')ans=ans*10+ch-'0',ch=getchar();
if(last=='-')ans=-ans; return ans;
}
const int N=100000;
const F pi=acos(-1);
const D mod=1e9+7;
const F _e=2.718281828459045;

/*快速幂*/
/*D swift(D a,D b){
    D ans=1ll;
    while(b){
        if(b%2)ans=ans*a%mod;
        b>>=1;
        a=a*a%mod;
    }return ans;
}*/

//D inv(D a){return swift(a,mod-2);}//费马小定理

/*扩展欧几里得*/
/*int exgcd(int a, int b, int &x, int &y){
    if(b==0){x=1;y=0;return a;}
    int r=exgcd(b,a%b,x,y);
    int t=x;x=y;y=t-a/b*y;return r;
    //int a=11,b=35,x,y,c=4;
    //int ans=exgcd(a,b,x,y);
    //printf("%d * %d + %d * %d = %d\n",a,c/ans*x,b,c/ans*y,c);
}*/

/*无取模求gcd*/
/*D stein(D a, D b){
    if(a==0) return b;
    if(b==0) return a;
    if(a%2==0&&b%2==0) return 2*stein(a>>1,b>>1);
    else if(a%2==0) return stein(a>>1,b);
    else if(b%2==0) return stein(a,b>>1);
    return stein(abs(a-b),min(a,b));
}*/

/*预处理逆元(线性)*/
/*D inv[N+9];
void INinv(){
    mmm(inv,0);
    inv[1] = inv[0] = 1;
    for(int i = 2; i <= N ; i++)
    inv[i] = ( mod - mod / i ) * inv[ mod % i ] % mod;
}*/

/*预处理阶乘*/
/*D fac[N+9];
D inv_fac[N+9];
void init_fac(){
    fac[0]=fac[1]=1ll;
    for(int i=2;i<=N;i++)fac[i]=fac[i-1]*i%mod;
    //预处理阶乘逆元
    inv_fac[N]=swift(fac[N],mod-2);//费马小定理求 N!的逆元
    for(D i=N-1;i>=1;i--) inv_fac[i]=(inv_fac[i+1]*(i+1))%mod;
    inv_fac[0]=1;
}*/

/*素数筛*/
/*int pri[N+9>>1],nowp;
bool ispri[N+9];
void init_pri(){
    for(int i=2;i<=N;i++)ispri[i]=1;
    for(int i=2;i<=N;i++){
        if(ispri[i])pri[++nowp]=i;
        for(int j=1;j<=nowp&&pri[j]*i<=N;j++){
            ispri[pri[j]*i]=1;
        }
    }
}*/

/*D A(D a,D b){//排列数 a下
    if(b>a||b<0)return 0;
    return fac[a]*inv_fac[a-b]%mod;
}
D C(D a,D b){//组合数 a下
    if(b>a||b<0)return 0;
    return fac[a]*inv_fac[a-b]%mod*inv_fac[b]%mod;
}

D arrange(D a,D b){//a个白球,b个黑球的排列
    return fac[a+b]*inv_fac[a]%mod*inv_fac[b]%mod;
}

D f_yanghui(D n,D m){//nm个杨辉三角数
    return C(n-1,m-1);
}

D stagger(D n){//错排(n错排)
    return (D)((F)fac[n]/_e+0.5);
}
D stagger(D n,D m){//错排(n选出m错排)
    return C(n,m)*stagger(m);
}

D catalan(D n){//卡特兰数
    return (C(2*n,n)-C(2*n,n-1)+mod)%mod;
}
D catalan(D n,D m){//m>n
    return (C(n+m,n)-C(n+m,n+1)+mod)%mod;
}*/
/*应用: 1.n个数进栈,有h(n)种出栈方式;
         2.凸n边形,用多条不相交的对角线分成三角形,有h(n-2)种可能性;
         3.n个节点,有h(n)种不同的二叉搜索树
         4.给n对括号排序,有h(n)种不同的正确的排序方式
         5.买票找零n个50元,m100元(一开始柜台没零钱)
         6.n*n棋盘从左下角走到右上角而不穿过主对角线的走法
         7.矩阵连乘的括号化
         8.在圆上选择2n个点,将这些点成对连接起来使得所得到的n条线段不相交的方法数
         9.9.n层阶梯矩阵切割成n个长度递增矩阵的切割法
*/

/*D through(D x,D y){//x*y矩阵对角线穿过1*1数量
    return x+y-__gcd(x,y);
}
D through(D x,D y,D z){//x*y*z立方体对角线穿过1*1*1数量
    return x+y+z-__gcd(x,y)-__gcd(y,z)-__gcd(z,x)+__gcd(__gcd(x,y),z);
}*/

/*拉格朗日插值法
struct Point{
    double x;
    double y;
};
// 给未知函数几个点坐标,横坐标范围(a,b),就能大致估算(a,b)内x对应的f(x)
double Lagrange(Point pt_list[],int pt_num,double x){
    int i,j; F ret=0;
    for(i=1;i<=pt_num;++i){
        double tmp=1.0;
        for(j=1;j<=pt_num;++j) {
            if(i!=j){
                tmp=tmp*(x-pt_list[j].x)/(pt_list[i].x-pt_list[j].x);
            }
        }
        ret=ret+pt_list[i].y*tmp;
    }
    return ret;
}*/


int main(){
    //init_fac();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值