由于不想被退学忙于学习,好久不打了……
A
感觉不是那么签到……问题可以转化为10^n=am^2+bm+c,求b,然后就转化为普通的快速幂即可
#include<bits/stdc++.h> using namespace std; long long n; int m,a=10,ret=1; int main() { cin>>n>>m; while(n) { if(n%2)ret=1ll*ret*a%(m*m); a=1ll*a*a%(m*m),n>>=1; } printf("%d\n",ret/m); }
B
发现如果把每一张卡片视为一条无向边(ai,bi),答案就是每个连通块中点数和边数的最小值,证明可以任取连通块中的一棵生成树,尝试加边即可证明。
#include<bits/stdc++.h> using namespace std; const int N=4e5+7; int n,ans,f[N],sz[N],e[N]; int find(int x){return x==f[x]?x:f[x]=find(f[x]);} int main() { scanf("%d",&n); for(int i=1;i<=4e5;i++)sz[i]=1,f[i]=i; for(int i=1,x,y;i<=n;i++) { scanf("%d%d",&x,&y); x=find(x),y=find(y); if(x!=y)f[x]=y,sz[y]+=sz[x],e[y]+=e[x]+1; else e[x]++; } for(int i=1;i<=4e5;i++)ans+=min(e[find(i)],sz[find(i)]),e[find(i)]=sz[find(i)]=0; printf("%d\n",ans); }
C
容易发现对每一个目标箱子不在自己手上的人,体重重于目标箱子即可,然后从体重轻的开始交换就行了,但是由于细节WA了一发导致本身不高的名次更加难堪
#include<bits/stdc++.h> using namespace std; const int N=2e5+7; struct node{int x,id;}a[N]; int n,m,b[N],p[N],pid[N],aa[N],ab[N],pos[N]; bool cmp(node a,node b){return a.x<b.x;} int main() { scanf("%d",&n); for(int i=1;i<=n;i++)scanf("%d",&a[i].x),a[i].id=i; for(int i=1;i<=n;i++)scanf("%d",&b[i]); for(int i=1;i<=n;i++)scanf("%d",&p[i]),pid[p[i]]=i; for(int i=1;i<=n;i++)if(i!=p[i]&&a[i].x<=b[p[i]]){puts("-1");return 0;} sort(a+1,a+n+1,cmp); for(int i=1;i<=n;i++) if(p[a[i].id]!=a[i].id) { int now=a[i].id; aa[++m]=now,ab[m]=pid[now]; p[pid[now]]=p[now],pid[p[now]]=pid[now]; } printf("%d\n",m); for(int i=1;i<=m;i++)printf("%d %d\n",aa[i],ab[i]); }
新号打的
rank371 performance=1978 rating=778
原文:https://www.cnblogs.com/hfctf0210/p/14272158.html