训练做的题里有板子单独拉出来。
欧拉筛

1 int vis[N+5],prim[N+5];
2 int cnt;
3 void Eular()
4 {
5 vis[0]=vis[1]=1;
6 for(int i=0;i<N;i++)
7 if(!vis[i])
8 {
9 prim[cnt++]=i;
10 for(ll j=(ll)i*i;j<N;j+=i) vis[j]=1;
11 }
12 }
辗转相除法求逆元

1 ll ans,re;
2 void e_gcd(ll a,ll b)
3 {
4 if(b==0)
5 {
6 ans=1,re=0;
7 return;
8 }
9 e_gcd(b,a%b);
10 ll temp=ans;
11 ans=re; ///***
12 re=temp-a/b*re;
13 }
SPFA找环【bfs

1 int vis[N];
2 bool spfa_bfs()
3 {
4 ans[s]=v;
5 vis[s]=1;
6 queue<int> qu;
7 qu.push(s);
8 while(!qu.empty())
9 {
10 int node=qu.front();
11 qu.pop();
12 vis[node]=0;
13 for(int i=1;i<=n;i++)
14 {
15 if(ans[i]<(ans[node]-ma2[node][i])*ma1[node][i])
16 {
17 ans[i]=(ans[node]-ma2[node][i])*ma1[node][i];
18 if(ans[s]>v) return true;
19 if(!vis[i]) qu.push(i),vis[i]=1;
20 }
21 }
22 }
23 return false;
24 }
二维树状数组

1 int ma[N][N];
2 int n,m;
3 inline int lowbit(int x){return x&-x;}
4 void updata(int x,int y)
5 {
6 for(int i=x;i<=n;i+=lowbit(i))
7 for(int j=y;j<=m;j+=lowbit(j)) ma[i][j]++;
8 }
9 int query(int x,int y)
10 {
11 int res=0;
12 for(int i=x;i>0;i-=lowbit(i))
13 for(int j=y;j>0;j-=lowbit(j)) res+=ma[i][j];
14 return res;
15 }
矩阵相乘&矩阵快速幂

1 int n;
2 struct p{
3 double matris[30][30];
4 }Rl,tep,res,wat,ans;
5 void init()
6 {
7 memset(Rl.matris,0,sizeof(Rl.matris));
8 memset(res.matris,0,sizeof(res.matris));
9 memset(tep.matris,0,sizeof(tep.matris));
10 memset(wat.matris,0,sizeof(wat.matris));
11 for(int i=1;i<=n;i++) tep.matris[i][i]=1;
12 }
13 p Matris(p a,p b)
14 {
15 p tem;
16 memset(tem.matris,0,sizeof(tem.matris));
17 for(int i=1;i<=n;i++)
18 for(int j=1;j<=n;j++)
19 for(int k=1;k<=n;k++)
20 tem.matris[i][j]+=a.matris[i][k]*b.matris[k][j];
21 return tem;
22 }
23 p quick_mi(ll n)
24 {
25 p m=Rl,b=tep;
26 while(n)
27 {
28 if(n&1) b=Matris(b,m);
29 m=Matris(m,m);
30 n/=2;
31 }
32 return b;
33 }
