其他模板收录QAQ
这里主要收录一些不知道怎么分类的模板QAQ
啊我还是太弱了居然还要收录模板
1.矩阵快速幂
1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<cstring> 5 #include<algorithm> 6 using namespace std; 7 struct matrix 8 { 9 long long m[3][3]; 10 }ans ,base; 11 long long n; 12 const long long mod=1000000007; 13 matrix muti(matrix a,matrix b)//矩阵乘法满足分配率(A+B)*C=A*C+B*C,满足结合律 (A*B)*C=A*(B*C),但不满足交换律 A*B!=B*A 14 { 15 matrix tmp; 16 for(int i=1;i<=2;i++) 17 for(int j=1;j<=2;j++) 18 { 19 tmp.m[i][j]=0; 20 for(int k=1;k<=2;k++) 21 tmp.m[i][j]=(tmp.m[i][j]+a.m[i][k]*b.m[k][j])%mod; 22 } 23 return tmp; 24 } 25 void qpow(long long x) 26 { 27 while(x) 28 { 29 if(x&1) ans=muti(ans,base); 30 base=muti(base,base); 31 x>>=1; 32 } 33 } 34 int main() 35 { 36 scanf("%lld",&n); 37 if(n<=2) 38 { 39 printf("%d",1); 40 return 0; 41 } 42 base.m[1][1]=1;base.m[1][2]=1; 43 base.m[2][1]=1;base.m[2][2]=0; 44 ans.m[1][1]=1;ans.m[1][2]=1; 45 qpow(n-2); 46 printf("%lld",ans.m[1][1]%mod); 47 return 0; 48 }
2.离散化
1 //离散化模板 2 int a[],b[]//原数组,离散化后的数组 3 for(int i=1;i<=n;i++) 4 { 5 scanf("%d",&a[i]); 6 b[i]=a[i]; 7 } 8 sort(a+1,a+1+n); 9 int len=unique(a+1,a+1+n)-a-1;//unique去重并返回长度 10 for(int i=1;i<=n;i++) 11 { 12 b[i]=lower_bound(a+1,a+1+len,b[i])-a; 13 } 14 15 16 17 int a[],int b[]; 18 for(int i-1;i<=n;i++) 19 { 20 scanf("%d",&a[i]); 21 b[i]=a[i]; 22 } 23 sort(a+1,a+1+n); 24 int len=unique(a+1,a+1+n)-a-1; 25 for(int i=1;i<=n;i++) 26 { 27 b[i]=lower_bound(a+1,a+1+len,b[i])-a; 28 }
3.快读
1 //int 型的快读,可修改如long long等 2 //如果有大量无用空格还是用scanf 3 //仅读入正负整数 4 inline int read() 5 { 6 int ret=0,f=1;char ch=getchar(); 7 while(ch<'0'||ch>'9'){if(ch=='-')f=-f;ch=getchar();} 8 while(ch>='0'&&ch<='9'){ret=ret*10+ch-'0';ch=getchar();} 9 return ret*f; 10 } 11 12 int n=read(); 13 14 inline int read() 15 { 16 int ret=0,f=1; char ch=getchar() 17 while(ch<'0'||ch>'9'){if(ch=='-') f=-f;ch=getchar();} 18 while(ch>='0'&&ch=<'9'){ret=ret*10+ch-'0';ch=getchar();} 19 return ret*f; 20 } 21 22 23 //套用模板类,自由读入不同类型的正负整数 24 template<class T> 25 inline T read(){ 26 char c=getchar();T x=0;bool f=0; 27 while(!isdigit(c))f^=!(c^45),c=getchar(); 28 while(isdigit(c))x=(x<<1)+(x<<3)+(c^48),c=getchar(); 29 if(f)x=-x;return x; 30 } 31 int x=read<int>(); 32 long long y=read<long long>();