板子题

离Noip也不远了,最后\(30\)天,每天早上都会敲一敲板子.

随机放出.(大家也能看一看 qwq.

并查集

#include<cstdio>
#define R register
using namespace std;
int n,m,f[10008];
int find(int x){return f[x]==x?x:f[x]=find(f[x]);}
int main()
{
    scanf("%d%d",&n,&m);
    for(R int i=1;i<=n;i++)f[i]=i;
    for(R int i=1,opt,a,b;i<=m;i++)
    {
        scanf("%d%d%d",&opt,&a,&b);
        if(opt==1)
        {
            R int fa=find(a),fb=find(b);
            f[fa]=fb;
        }
        else
        {
            R int fa=find(a),fb=find(b);
            puts(fa==fb?"Y":"N");
        }
    }
}

快速幂

注意这里要判断\(1^0 mod \ 1=0\)的情况.

#include<cstdio>
#define int long long
#define R register
using namespace std;
inline int ksm(int x,int y,int p)
{
    if(y==0)return 1;
    int res=1;
    for(;y;y>>=1,x=x*x%p)
        if(y&1)res=res*x%p;
    return res%p;
}
int x,y,p;
signed main()
{
    scanf("%lld%lld%lld",&x,&y,&p);
    printf("%lld^%lld mod %lld=%lld",x,y,p,ksm(x,y,p)%p);
}

线性筛素数

顺便写了筛欧拉函数\(\phi\)

应该没锅 qwq

#include<cstdio>
#define R register
using namespace std;
int n,m,prime[100000008],tot,phi[100000008];
bool vis[100000008];
inline void pri()
{
    vis[1]=true;
    for(R int i=2;i<=n;i++)
    {
        if(!vis[i])prime[++tot]=i,phi[i]=i-1;
        for(R int j=1;j<=tot and i*prime[j]<=n;j++)
        {
            vis[i*prime[j]]=true;
            if(i%prime[j]==0)
            {
                phi[i*prime[j]]=phi[i]*prime[j];
                break;
            }
            phi[i*prime[j]]=phi[i]*phi[prime[j]];
        }
    }
}
int main()
{
    scanf("%d%d",&n,&m);
    pri();
    for(R int x;m;m--)
    {
        scanf("%d",&x);
        puts(vis[x]==0?"Yes":"No");
    }
}

最小生成树

\(Kruskal\)做法 \(O(n\ logn)\)

#include<cstdio>
#include<algorithm> 
#define N 5000
#define R register
using namespace std;
struct cod{
    int u,v,w;
    bool operator <(const cod&a)const
    {
        return w<a.w;
    }
}edge[N*N+10];
int n,m,f[N],tot,cnt,ans;
int find(int x){return f[x]==x?x:f[x]=find(f[x]);}
int main()
{
    scanf("%d%d",&n,&m);
    for(R int i=1;i<=n;i++)f[i]=i;
    for(R int i=1;i<=m;i++)
        scanf("%d%d%d",&edge[i].u,&edge[i].v,&edge[i].w);
    sort(edge+1,edge+m+1);
    for(R int i=1;i<=m;i++)
    {
        int u=edge[i].u,v=edge[i].v,w=edge[i].w;
        int fu=find(u),fv=find(v);
        if(fu==fv)continue;
        ans+=w;cnt++;f[fu]=fv;
        if(cnt==n-1)break;
    }
    if(cnt==n-1)printf("%d",ans);
    else printf("orz");
}

堆优化\(Prime\) \(O(n\ logn)\)

待补ing

猜你喜欢

转载自www.cnblogs.com/-guz/p/9752349.html
今日推荐