首页 > 技术文章 > 其他模板收录QAQ

xwx2354672579 2019-08-26 19:21 原文

这里主要收录一些不知道怎么分类的模板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>();
qread

 

推荐阅读