离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