板子总结(超长篇)

ACM 算法模板
皮
一
下
很
开
心

原创模板



1、	快速幂&GCD
int gcd(int a,int b){return a?gcd(a,a%b):b;}
typedef long long ll;
ll quickmod(ll a,ll b,ll mod)//快速幂  
{  
    ll ans = 1;  
    while(b)  
    {  
        if(b&1)  
        ans = (ans*a)%mod;  
        a = (a*a)%mod;  
        b >>= 1;  
    }  
    return ans;  
}
2、	Kruskal算法
3、	#include  
4、	using namespace std;  
5、	#define maxn 50005  
6、	#define INF 0x3f3f3f3f  
7、	int par[maxn],rank[maxn];  
8、	struct edge//边的信息   
9、	{  
10、	    int u,v,cost;  
11、	}es[maxn];  
12、	bool cmp(edge a,edge b)  
13、	{  
14、	    return a.cost  
2.	#include  
3.	#include  
4.	using namespace std;  
5.	int main()  
6.	{  
7.	    long long n,t;  
8.	    cin>>t;  
9.	    while(t--)  
10.	    {  
11.	        cin>>n;  
12.	        if(n==1) cout<<"1"<  
2.	using namespace std;  
3.	int a[10][10];//地图   
4.	int b[10][10];//障碍  
5.	int sx,sy;//起点  
6.	int ex,ey;//终点  
7.	int zx,zy;  
8.	int s=0;  
9.	int dx[4]={-1,1,0,0};  
10.	int dy[4]={0,0,1,-1};  
11.	void dfs(int x,int y)  
12.	{  
13.	    if(x==ex&&y==ey)  
14.	    {  
15.	        s++;  
16.	        return ;  
17.	    }  
18.	    for(int i=0;i<=3;i++)  
19.	    {  
20.	        if(a[x+dx[i]][y+dy[i]]==0&&b[x+dx[i]][y+dy[i]]==1)  
21.	        {  
22.	            a[x][y]=1;  
23.	            dfs(x+dx[i],y+dy[i]);  
24.	            a[x][y]=0;  
25.	        }  
26.	    }  
27.	 }  
28.	 int main()  
29.	 {  
30.	    int n,m,t;  
31.	    cin>>n>>m>>t;  
32.	    for(int i=1;i<=n;i++)  
33.	    {  
34.	        for(int j=1;j<=m;j++)  
35.	        {  
36.	            b[i][j]=1;//无障碍物   
37.	         }  
38.	    }  
39.	    cin>>sx>>sy>>ex>>ey;  
40.	    for(int i=1;i<=t;i++)  
41.	    {  
42.	        cin>>zx>>zy;  
43.	        b[zx][zy]=0;  
44.	    }  
45.	    dfs(sx,sy);  
46.	    cout<  
2.	#include  
3.	using namespace std;  
4.	const double eps=1e-6;  
5.	struct point  
6.	{  
7.	    double x,y;  
8.	};  
9.	bool panduan(point a,point b,point c,point d)  
10.	{  
11.	    if(min(a.x, b.x) > max(c.x, d.x) || min(a.y, b.y) > max(c.y, d.y) || min(c.x, d.x) > max(a.x, b.x) || min(c.y, d.y) > max(a.y, b.y) )//快速排斥实验  
12.	        return 0;  
13.	    double h, i, j, k;  
14.	   h = (b.x - a.x) * (c.y - a.y) - (b.y - a.y) * (c.x - a.x);//c.b.a//跨立实验  
15.	   i = (b.x - a.x) * (d.y - a.y) - (b.y - a.y) * (d.x - a.x);//d.b.a  
16.	   j = (d.x - c.x) * (a.y - c.y) - (d.y - c.y) * (a.x - c.x);//a.d.c  
17.	   k = (d.x - c.x) * (b.y - c.y) - (d.y - c.y) * (b.x - c.x);//b.d.c  
18.	   return h*i<=eps&&j*k<=eps;  
19.	  
20.	  
21.	}  
22.	int main()  
23.	{  
24.	     point a,b,c,d;  
25.	     int t;  
26.	     cin>>t;  
27.	     while(t--)  
28.	     {  
29.	        cin>>a.x>>a.y>>b.x>>b.y>>c.x>>c.y>>d.x>>d.y;  
30.	        if(panduan(a,b,c,d))  
31.	         {  
32.	             cout<<"Yes"<  
2.	using namespace std;  
3.	long long a[200005];  
4.	int n;  
5.	long long maxsum(long long a[],long long n)  
6.	{  
7.	    long long ms,mh;  
8.	    ms=mh=a[0];  
9.	    for(int i=1;ims)  
20.	        {  
21.	            ms=mh;  
22.	        }  
23.	    }  
24.	    return ms;  
25.	}  
26.	int main()  
27.	{  
28.	    int n;  
29.	    cin>>n;   
30.	    for(int i=0;i>a[i];  
33.	    }  
34.	    cout<  
2.	#include  
3.	using namespace std;  
4.	int a[300005];  
5.	int dp[300005];  
6.	int main()  
7.	{  
8.	    int n;  
9.	    while(cin>>n)  
10.	    {  
11.	        for(int i=0;i>a[i];  
14.	            dp[i]=1;  
15.	        }  
16.	        for(int i=n-1;i>=0;i--)  
17.	        {  
18.	            for(int j=i+1;jmaxx)  
30.	            {  
31.	                maxx=dp[i];  
32.	            }  
33.	        }  
34.	        cout<  
2.	#include  
3.	using namespace std;  
4.	#define MAXN 120  
5.	const int mod=1e9+7;  
6.	typedef long long ll;  
7.	int n;  
8.	struct mat  
9.	{  
10.	    ll m[MAXN][MAXN];//矩阵结构体  
11.	}unit;//unit为单位矩阵,即主对角线全部为1,这样任何矩阵与单位矩阵相乘都为它本身  
12.	  
13.	mat msub(mat a,mat b)//矩阵相乘函数  
14.	{  
15.	    mat ret;  
16.	    ll x;  
17.	    for(int i=0;i>=1;  
49.	    }  
50.	    return ans;  
51.	}  
52.	  
53.	int main()  
54.	{  
55.	    ll x;  
56.	    init_unit();  
57.	    cin>>n>>x;  
58.	    mat a,ans;  
59.	    for(int i=0;i>a.m[i][j];  
64.	        }  
65.	    }  
66.	    ans=qpow(a,x);  
67.	    for(int i=0;i  
2.	#include  
3.	#include  
4.	using namespace std;  
5.	#define MAXN 1005  
6.	char a[MAXN],b[MAXN];  
7.	int dp[MAXN][MAXN];  
8.	int d[MAXN][MAXN];  
9.	void dfs(int l1,int l2)  
10.	{  
11.	    if(l1==0||l2==0)  
12.	    {  
13.	        return ;  
14.	    }  
15.	    if(d[l1][l2]==0)  
16.	    {  
17.	        dfs(l1-1,l2-1);  
18.	        cout<>a>>b;  
34.	    int l1=strlen(a);  
35.	    int l2=strlen(b);  
36.	    for(int i=1;i<=l1;i++)  
37.	    {  
38.	        for(int j=1;j<=l2;j++)  
39.	        {  
40.	            if(a[i-1]==b[j-1])  
41.	            {  
42.	                dp[i][j]=dp[i-1][j-1]+1;  
43.	                d[i][j]=0;  
44.	            }  
45.	            else if(dp[i][j-1]>=dp[i-1][j])  
46.	            {  
47.	                dp[i][j]=dp[i][j-1];  
48.	                d[i][j]=1;  
49.	            }  
50.	            else  
51.	            {  
52.	                dp[i][j]=dp[i-1][j];  
53.	                d[i][j]=-1;  
54.	            }  
55.	        }  
56.	    }  
57.	    dfs(l1,l2);  
58.	    cout<  
2.	#include  
3.	#include  
4.	using namespace std;  
5.	#define MAXN 1005  
6.	char a[MAXN],b[MAXN];  
7.	int dp[MAXN][MAXN];  
8.	int d[MAXN][MAXN];  
9.	void dfs(int l1,int l2)  
10.	{  
11.	    if(l1==0||l2==0)  
12.	    {  
13.	        return ;  
14.	    }  
15.	    if(d[l1][l2]==0)  
16.	    {  
17.	        dfs(l1-1,l2-1);  
18.	        cout<>a>>b;  
34.	    int l1=strlen(a);  
35.	    int l2=strlen(b);  
36.	    for(int i=1;i<=l1;i++)  
37.	    {  
38.	        for(int j=1;j<=l2;j++)  
39.	        {  
40.	            if(a[i-1]==b[j-1])  
41.	            {  
42.	                dp[i][j]=dp[i-1][j-1]+1;  
43.	                d[i][j]=0;  
44.	            }  
45.	            else if(dp[i][j-1]>=dp[i-1][j])  
46.	            {  
47.	                dp[i][j]=dp[i][j-1];  
48.	                d[i][j]=1;  
49.	            }  
50.	            else  
51.	            {  
52.	                dp[i][j]=dp[i-1][j];  
53.	                d[i][j]=-1;  
54.	            }  
55.	        }  
56.	    }  
57.	    dfs(l1,l2);  
58.	    cout<  
2.	#include  
3.	#include  
4.	using namespace std;  
5.	#define MAXN 10005  
6.	int c[MAXN];  
7.	int a[MAXN];  
8.	int n;   
9.	int lowbit(int x)  
10.	{  
11.	    return x&(-x);  
12.	}  
13.	void add(int x,int p)//对x位置增加p;   
14.	{  
15.	    while(x<=n)  
16.	    {  
17.	        c[x]+=p;  
18.	        x+=lowbit(x);  
19.	    }  
20.	}  
21.	int getsum(int x)//1-x的和 ;   
22.	{  
23.	    int res=0;  
24.	    while(x)  
25.	    {  
26.	        res+=c[x];  
27.	        x-=lowbit(x);  
28.	    }  
29.	    return res;  
30.	}  
31.	  
32.	int main()  
33.	{  
34.	    cin>>n;  
35.	    for(int i=1;i<=n;i++)  
36.	    {  
37.	        cin>>a[i];  
38.	    }  
39.	    memset(c,0,sizeof(c));  
40.	    for(int i=1;i<=n;i++)  
41.	    {  
42.	        add(i,a[i]);//构造树状数组   
43.	    }  
44.	    int l,r;  
45.	    while(cin>>l>>r)  
46.	    {  
47.	        cout<  
2.	#include  
3.	  
4.	using namespace std;  
5.	#define maxn 100005  
6.	int par[maxn];  
7.	int rank1[maxn];  
8.	int a[maxn],b[maxn];  
9.	char c[maxn];  
10.	int n,k;  
11.	void init(int n)//模板   
12.	{  
13.	    for(int i=0;ia  
16、多边形面积
1.	#include   
2.	struct point{double x,y;};  
3.	  
4.	  
5.	//计算cross product (P1-P0)x(P2-P0)  
6.	double xmult(point p1,point p2,point p0){  
7.	    return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);  
8.	}  
9.	double xmult(double x1,double y1,double x2,double y2,double x0,double y0){  
10.	    return (x1-x0)*(y2-y0)-(x2-x0)*(y1-y0);  
11.	}  
12.	  
13.	  
14.	//计算三角形面积,输入三顶点  
15.	double area_triangle(point p1,point p2,point p3){  
16.	    return fabs(xmult(p1,p2,p3))/2;  
17.	}  
18.	double area_triangle(double x1,double y1,double x2,double y2,double x3,double y3){  
19.	    return fabs(xmult(x1,y1,x2,y2,x3,y3))/2;  
20.	}  
21.	  
22.	  
23.	//计算三角形面积,输入三边长  
24.	double area_triangle(double a,double b,double c){  
25.	    double s=(a+b+c)/2;  
26.	    return sqrt(s*(s-a)*(s-b)*(s-c));  
27.	}  
28.	  
29.	  
30.	//计算多边形面积,顶点按顺时针或逆时针给出  
31.	double area_polygon(int n,point* p){  
32.	    double s1=0,s2=0;  
33.	    int i;  
34.	    for (i=0;i  
2.	#include  
3.	using namespace std;  
4.	#define MAXN 1000005  
5.	typedef long long ll;  
6.	ll m[MAXN],a[MAXN];  
7.	ll n;  
8.	void exgcd(ll a,ll b,ll &x,ll &y)  
9.	{  
10.	    if(!b)  
11.	    {  
12.	        x=1;  
13.	        y=0;  
14.	        return ;  
15.	    }  
16.	    exgcd(b,a%b,x,y);  
17.	    ll t=x;  
18.	    x=y;  
19.	    y=t-(a/b)*y;  
20.	}  
21.	  
22.	ll crt(ll a[],ll m[],ll n)  
23.	{  
24.	    ll M=1;  
25.	    ll ans=0;  
26.	    ll x,y;  
27.	    for(ll i=0;i>n;  
43.	    for(ll i=0;i>m[i]>>a[i];  
46.	    }  
47.	    cout<  
2.	#include  
3.	#include  
4.	using namespace std;  
5.	#define MAXN 1000050  
6.	char s[MAXN];  
7.	char t[MAXN];  
8.	int l1,l2;  
9.	int nxt[MAXN];  
10.	void getnxt()  
11.	{  
12.	    int j,k;  
13.	    j=0;  
14.	    k=-1;  
15.	    nxt[0]=-1;  
16.	    while(j0&&s[i]!=t[j])  
40.	        {  
41.	            j=nxt[j];  
42.	        }  
43.	        if(s[i]==t[j])  
44.	        {  
45.	            j++;  
46.	        }  
47.	        if(j==l2)  
48.	        {  
49.	            ans++;  
50.	            j=nxt[j];  
51.	        }  
52.	    }  
53.	    return ans;  
54.	}  
55.	int main()  
56.	{  
57.	    ios::sync_with_stdio(0);  
58.	    cin.tie(0);  
59.	    int T;  
60.	    cin>>T;  
61.	    while(T--)  
62.	    {  
63.	        cin>>t>>s;  
64.	        l1=strlen(s);  
65.	        l2=strlen(t);  
66.	        cout<  
2.	#include  
3.	#include  
4.	using namespace std;  
5.	#define MAXN 1000500  
6.	int s[MAXN];  
7.	int t[MAXN];  
8.	int n,m;  
9.	int nxt[MAXN];  
10.	void getnxt()  
11.	{  
12.	    int k,j;  
13.	    j=0;  
14.	    k=-1;  
15.	    nxt[0]=-1;  
16.	    while(j>T;  
52.	    while(T--)  
53.	    {  
54.	        memset(nxt,0,sizeof(nxt));  
55.	        cin>>n>>m;  
56.	        for(int i=0;i>s[i];  
57.	        for(int j=0;j>t[j];  
58.	        cout<  
2.	#include  
3.	using namespace std;  
4.	int ans[200][3000];  
5.	void ktl()//卡特兰打表  
6.	{  
7.	    ans[1][0]=1;  
8.	    ans[2][0]=1;  
9.	    ans[1][1]=1;  
10.	    ans[2][1]=2;  
11.	    int len=1;  
12.	    int carry;  
13.	    for(int i=3;i<=102;i++)  
14.	    {  
15.	        carry=0;//余数  
16.	        for(int j=1;j<=len;j++)  
17.	        {  
18.	            int t=ans[i-1][j]*(4*i-2)+carry;//先求分子  
19.	            carry=t/10;  
20.	            ans[i][j]=t%10;  
21.	        }  
22.	        while(carry)  
23.	        {  
24.	            ans[i][++len]=carry%10;  
25.	            carry/=10;  
26.	        }  
27.	        for(int j=len;j>=1;j--)  
28.	        {  
29.	            int t=ans[i][j]+carry*10;  
30.	            ans[i][j]=t/(i+1);  
31.	            carry=t%(i+1);  
32.	        }  
33.	        while(!ans[i][len])  
34.	        {  
35.	            len--;  
36.	        }  
37.	        ans[i][0]=len;  
38.	    }  
39.	}  
40.	int main()  
41.	{  
42.	    ktl();  
43.	    int n;  
44.	    while(cin>>n)  
45.	    {  
46.	        for(int i=ans[n][0];i>0;i--)  
47.	        {  
48.	            cout<  
2.	#include  
3.	#include  
4.	using namespace std;  
5.	#define MAXN 1000050  
6.	#define INF 0x3f3f3f3f  
7.	int dp[MAXN],n;  
8.	struct city  
9.	{  
10.	    int p,r;  
11.	}s[MAXN];  
12.	bool cmp(city a,city b)  
13.	{  
14.	    return a.p>n)  
20.	    {  
21.	        printf("Case %d:\n",cnt++);  
22.	        for(int i=0;i  
2.	#include  
3.	#include  
4.	using namespace std;  
5.	#define MAXN 1000500  
6.	char s[MAXN];  
7.	char str[MAXN];  
8.	int p[MAXN];  
9.	int l1,l2;  
10.	void init()  
11.	{  
12.	    str[0]='$';  
13.	    str[1]='#';  
14.	    for(int i=0;ii) p[i]=min(p[2*id-i],mx-i);  
29.	        else p[i]=1;  
30.	        for(;str[i+p[i]]==str[i-p[i]];p[i]++)  
31.	        {  
32.	            if(mx>s)  
43.	    {  
44.	        l1=strlen(s);  
45.	        init();  
46.	        manacher();  
47.	        int ans=0;  
48.	        for(int i=0;i  
2.	#include  
3.	#include  
4.	#include  
5.	using namespace std;  
6.	map mp;  
7.	#define MAXN 1000500  
8.	char c[MAXN];  
9.	char rc[MAXN];  
10.	int sum[MAXN];  
11.	int main()  
12.	{  
13.	    cin>>c;  
14.	    int l=strlen(c);  
15.	    memset(sum,0,sizeof(sum));  
16.	    for(int i=1;i<=l;i++)  
17.	    {  
18.	        rc[i]=c[i-1];  
19.	    }  
20.	    for(int i=1;i<=l;i++)  
21.	    {  
22.	        if(rc[i]=='1') sum[i]=sum[i-1]+1;  
23.	        else sum[i]=sum[i-1]-1;//记录前缀和   
24.	    }  
25.	    int ans=0;  
26.	    for(int i=1;i<=l;i++)  
27.	    {  
28.	        if(!sum[i])  
29.	        {  
30.	            ans=i;//前缀和为0   
31.	        }  
32.	        if(!mp[sum[i]])  
33.	        {  
34.	            mp[sum[i]]=i;//记录第一次前缀和为某值的下标,因为是最早的,所以map[sum[i]]的值不必更新   
35.	        }  
36.	        if(mp[sum[i]])  
37.	        {  
38.	            ans=max(ans,i-mp[sum[i]]);//更新区间 (前缀和相等的时候)  
39.	        }  
40.	    }  
41.	    cout<  
2.	#include  
3.	#include  
4.	using namespace std;  
5.	#define MAXN 1050  
6.	int rel[MAXN][MAXN];  
7.	int ind[MAXN];  
8.	int ans[MAXN];  
9.	int main()  
10.	{  
11.	    int n,m;  
12.	    int a,b;   
13.	    while(cin>>n>>m)  
14.	    {  
15.	        memset(rel,0,sizeof(rel));  
16.	        memset(ind,0,sizeof(ind));  
17.	        memset(ans,0,sizeof(ans));  
18.	        for(int i=0;i>a>>b;  
21.	            if(!rel[a][b])//坑点,需要先判断,否则入度会错误   
22.	            {  
23.	                rel[a][b]=1;  
24.	                ind[b]++;//记录入度   
25.	            }  
26.	        }  
27.	        int top,k=0;  
28.	        for(int i=0;i  
2.	#include  
3.	#include  
4.	#include  
5.	using namespace std;  
6.	#define MAXN 10050  
7.	vector e[MAXN];  
8.	int ind[MAXN];  
9.	int main()  
10.	{  
11.	    ios::sync_with_stdio(0);  
12.	    int n,m;  
13.	    while(cin>>n>>m&&n&&m)  
14.	    {  
15.	        queue q;  
16.	        for(int i=0;i>a>>b;  
25.	            e[a].push_back(b);  
26.	            ind[b]++;  
27.	        }  
28.	        for(int i=0;i
#include
using namespace std;
typedef long long ll;
#define maxn 100005
 
ll re[maxn];
ll k;
ll gcd(ll a,ll b) {
	return b?gcd(b,a%b):a;
}
ll lcm(ll a,ll b)
{
	return a/gcd(a,b)*b;
}
void primefactor(ll n)
{
	k=0;
	for(ll i=2;i*i<=n;i++)
	{
		if(n%i==0)
		{
			re[k++]=i;
			while(n%i==0)
			{
				n/=i;
			}
		}
	}
	if(n!=1)
	{
		re[k++]=n;
	}
}
int main()
{
	ll n,t,a,b;
	cin>>t;
	ll ci=1;
	while(t--)
	{
		cin>>a>>b>>n;
		ll d=n;
		primefactor(n);
		ll ans1=0;
		ll ans2=0;
		for(ll i=1;i<(1 << k);i++)
		{
			ll cnt=0;
			ll temp=1;
			for(ll j=0;j> j & 1)
				{
					cnt++;
					temp=lcm(temp,re[j]);
				}
			}
			if(cnt&1) ans1+=b/temp;
			else ans1-=b/temp;
		}
		ans1=b-ans1;
		for(ll i=1;i<(1 << k);i++)
		{
			ll cnt=0;
			ll temp=1;
			for(ll j=0;j> j & 1)
				{
					cnt++;
					temp=lcm(temp,re[j]);
				}
			}
			if(cnt&1) ans2+=(a-1)/temp;
			else ans2-=(a-1)/temp;
		}
		ans2=a-ans2;
		cout<<"Case #"<
#include
#include
using namespace std;
typedef long long ll;
#define maxn 100050
ll m;
struct point
{
	ll x,y;
}s[maxn],ch[maxn],re;
 
ll det(ll x1,ll y1,ll x2,ll y2)
{
	return x1*y2-y1*x2;
}
 
bool cmp(point a,point b)
{
	if(a.x==b.x) return a.y1&&det(ch[m-1].x-ch[m-2].x,ch[m-1].y-ch[m-2].y,p[i].x-ch[m-2].x,p[i].y-ch[m-2].y)<0) m--;
		ch[m++]=p[i];
	}
	ll k=m;
	for(ll i=n-2;i>=0;i--)
	{
		while(m>k&&det(ch[m-1].x-ch[m-2].x,ch[m-1].y-ch[m-2].y,p[i].x-ch[m-2].x,p[i].y-ch[m-2].y)<0)
		{
			m--;
		}
		ch[m++]=p[i];
	}
	if(n>1) m--;
}
 
ll area(point *ch,ll m)
{
	ll s=0;
	for(int i=1;i>n;
	for(ll i=0;i>s[i].x>>s[i].y;
	}
	converxhall(s,n,ch);
	cout<
#include
using namespace std;
#define MAXN 100005
typedef long long ll;
ll mod;
ll exgcd(ll a,ll b,ll &x,ll &y)//扩展欧几里得
{
	ll t;
	if(!b)
	{
		x=1;
		y=0;
		return 0;
	}
	exgcd(b,a%b,x,y);
	t=x;
	x=y;
	y=t-a/b*x;
}
ll inv(ll a)//求逆元
{
	ll x,y;
	exgcd(a,mod,x,y);
	return (x+mod)%mod;
}
ll qmod(ll a,ll b)
{
    ll ans=1;
    while(b)
    {
        if(b&1) ans=(ans*a)%mod;
        a=(a*a)%mod;
        b>>=1;
    }
    return ans;
}
int main()
{
    ll a,b,t;
        cin>>a>>mod;
        cout<
#include
#include
#include
using namespace std;
typedef long long ll;
#define MAXN 10000006
ll prime[670000]; 
bool vis[MAXN];
ll k;
void seive()
{
	for(int i=0;i>t;
    ll ci=1;
    while(t--)
    {
        cin>>n;
        ll m=2*n;
        ll ans=1;
        while(m%2==0) m/=2;
        for(ll i=0;prime[i]*prime[i]<=m&&i
#include
#include
#include
#include
using namespace std;
#define MAXN 100500
 
int gcd(int a,int b){return b?gcd(b,a%b):a;}
int n,t,k;
int dx,dy;
struct pt
{
    int x,y;
}s[MAXN];
int det(int x1,int y1,int x2,int y2)
{
    return x1*y2-x2*y1;
}
double area(pt *s,int n)
{
    int ans=0;
    for(int i=1;i>t;
    int cnt=1;
    while(t--)
    {
        cin>>n;
        s[0].x=0;
        s[0].y=0;
        for(int i=1;i<=n;i++)
        {
           cin>>dx>>dy;
           s[i].x=s[i-1].x+dx;
           s[i].y=s[i-1].y+dy;
        }
        cout<<"Scenario #"<

 

你可能感兴趣的:(板子总结(超长篇))