#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){//n行m个杨辉三角数
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元,m个100元(一开始柜台没零钱)
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();
}
数学模板
最新推荐文章于 2025-02-20 22:09:21 发布