A. Good ol’ Numbers Coloring

#include <bits/stdc++.h> using namespace std; typedef long long ll; int MAXN=1e5+10; int main(){ int T; cin>>T; while(T--){ int a,b; cin>>a>>b; if(__gcd(a,b)==1)cout<<"Finite"<<endl; else cout<<"Infinite"<<endl; } return 0; }
B. Restricted RPS
题意:石头剪刀布。判断输赢,并且输出赢的方法。模拟。

#include <bits/stdc++.h> using namespace std; const int MAXN=1e5+10; bool vis[MAXN]; char s[MAXN]; int main(){ int T,n; cin>>T; while(T--){ memset(vis,0,sizeof(vis)); cin>>n; int a,b,c; cin>>a>>b>>c; cin>>s; int tot=0; for(int i=0;i<n;i++){ if(s[i]=='R'&&b){ b--; s[i]='P'; vis[i]=true; tot++; } else if(s[i]=='P'&&c){ c--; s[i]='S'; vis[i]=true; tot++; } else if(s[i]=='S'&&a){ a--; s[i]='R'; vis[i]=true; tot++; } } if(tot>=(n+1)/2){ cout<<"YES"<<endl; for(int i=0;i<n;i++){ if(vis[i])cout<<s[i]; else { if(a){ a--;cout<<'R'; } else if(b){ b--;cout<<'P'; } else if(c)c--,cout<<'S'; } }cout<<endl; } else cout<<"NO"<<endl; } return 0; }
C. Constanze’s Machine
题意:给一个改动过的字符串,判断原本的字符串有多少中可能
w会变成uu,m会变成nn,其他字符不变
解:对于几个连续的u或者n,它的方案数为对应的斐波那契数,然后每一部分的乘积就为答案

#include <bits/stdc++.h> using namespace std; typedef long long ll; const int MAXN=1e5+10; const int mod=1e9+7; ll pre[MAXN]; void init(){ pre[1]=1; pre[2]=2; pre[3]=3; for(int i=4;i<MAXN;i++)pre[i]=(pre[i-1]%mod+pre[i-2]%mod)%mod; } int main(){ init(); string s; cin>>s; bool ok=true; ll ans=1; ll res=1; int cnt=1; int n=s.size(); for(int i=0;i<n;i++){ if(s[i]=='m'||s[i]=='w')ok=false; if((s[i]=='n'&&s[i-1]=='n')||(s[i]=='u'&&s[i-1]=='u'))cnt++; else { ans=((ans%mod)*(pre[cnt]%mod)%mod); cnt=1; } } if(s[n-1]=='u'||s[n-1]=='n')ans=((ans%mod)*(pre[cnt]%mod)%mod); if(!ok)cout<<0<<endl; else cout<<ans<<endl; return 0; }
D. Shichikuji and Power Grid
题意:对于每个城市要么建站,要么连线,求最小花费,至少一个城市建站。
解:建立一个零点,作为建站的选择。最小生成树。

#include <bits/stdc++.h> using namespace std; typedef long long ll; const int MAXN=2020; int n; ll c[MAXN],k[MAXN],x[MAXN],y[MAXN]; ll g[MAXN][MAXN]; struct node{ int u,v; ll cost; }a[1000000]; ll js(int i,int j){ return (abs(x[i]-x[j])+abs(y[i]-y[j]))*(k[i]+k[j]); } bool cmp(node a,node b){ return a.cost<b.cost; } vector<int>ans1; vector<pair<int,int> >ans2; int pre[MAXN]; int find(int w){ return pre[w]==w?w:find(pre[w]); } int main(){ cin>>n; for(int i=1;i<=n;i++)cin>>x[i]>>y[i]; for(int i=1;i<=n;i++)cin>>c[i]; for(int i=1;i<=n;i++)cin>>k[i]; for(int i=1;i<=n;i++)pre[i]=i; int tot=0; for(int i=1;i<=n;i++){ a[tot].u=0,a[tot].v=i; a[tot++].cost=c[i]; } for(int i=1;i<=n;i++){ for(int j=i+1;j<=n;j++){ a[tot].u=i; a[tot].v=j; a[tot++].cost=js(i,j); } } sort(a,a+tot,cmp); ll ans=0; for(int i=0;i<tot;i++){ if(!n)break; int nx=find(a[i].u); int ny=find(a[i].v); if(nx!=ny){ pre[ny]=pre[nx]; ans+=a[i].cost; if(a[i].u==0)ans1.push_back(a[i].v); else ans2.push_back(make_pair(a[i].u,a[i].v)); n--; } } cout<<ans<<endl; cout<<ans1.size()<<endl; for(int i=0;i<ans1.size();i++)cout<<ans1[i]<<' ';cout<<endl; cout<<ans2.size()<<endl; for(int i=0;i<ans2.size();i++)cout<<ans2[i].first<<' '<<ans2[i].second<<endl; return 0; }