BZ周赛Round#2
目录
A.robot
估算一下,一共小于4^4种,dfs直接爆搜
code:
cnt的特判注意一下为cnt>=len+1
#include<bits/stdc++.h>
#define xp first
#define yp second
using namespace std;
int n,m,len,ans;
pair<int,int>s;
char a[105][105];
string b;
bool check(int i,int j,int k,int l){
if(i==j||i==k||i==l||j==k||j==l||k==l) return 1;
return 0;
}
void dfs(int x,int y,int i,int j,int k,int l,int cnt){
if(x<1||x>n||y<1||y>m||cnt>=len+1||a[x][y]=='#') return;
if(a[x][y]=='E') {
ans++;
return;
}
if(b[cnt]=='0'){
if(i==0) dfs(x,y-1,i,j,k,l,cnt+1);
else if(i==1) dfs(x,y+1,i,j,k,l,cnt+1);
else if(i==2) dfs(x-1,y,i,j,k,l,cnt+1);
else dfs(x+1,y,i,j,k,l,cnt+1);
}
else if(b[cnt]=='1'){
if(j==0) dfs(x,y-1,i,j,k,l,cnt+1);
else if(j==1) dfs(x,y+1,i,j,k,l,cnt+1);
else if(j==2) dfs(x-1,y,i,j,k,l,cnt+1);
else dfs(x+1,y,i,j,k,l,cnt+1);
}
else if(b[cnt]=='2'){
if(k==0) dfs(x,y-1,i,j,k,l,cnt+1);
else if(k==1) dfs(x,y+1,i,j,k,l,cnt+1);
else if(k==2) dfs(x-1,y,i,j,k,l,cnt+1);
else dfs(x+1,y,i,j,k,l,cnt+1);
}
else{
if(l==0) dfs(x,y-1,i,j,k,l,cnt+1);
else if(l==1) dfs(x,y+1,i,j,k,l,cnt+1);
else if(l==2) dfs(x-1,y,i,j,k,l,cnt+1);
else dfs(x+1,y,i,j,k,l,cnt+1);
}
}
int main(){
//freopen("robot.in","r",stdin);
//freopen("robot.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
if(a[i][j]=='S') s=make_pair(i,j);
}
}
cin>>b;
len=b.size();
for(int i=0;i<4;i++){
for(int j=0;j<4;j++){
for(int k=0;k<4;k++){
for(int l=0;l<4;l++){
if(check(i,j,k,l)) continue;
dfs(s.xp,s.yp,i,j,k,l,0);
}
}
}
}
printf("%d",ans);
}
B.paint
瞪眼法观察,发现可以使用乘法原理进行答案的求解:
case1:当前是一个竖着放的骨牌,又分两种情况
case1.1 前面也是一个竖着放的骨牌:因为前面已有一个确定的颜色,所以当前位·· 置只有两种颜色可选,故ans*=2
case1.2 前面是两个横着放的骨牌:因为前面已有两个确定的颜色,所以当前位·· 置只有一种颜色可选,故ans不变、
case2:当前是两个横着放的骨牌,同理分两种情况讨论
case2.1 前面是一个竖着放的骨牌: 对于两个横着放的骨牌其中一个确定颜色加上 前面是一个竖着放的骨牌,另一个即可确定, 故ans*=2
case2.2 前面是两个横着放的骨牌:画图统计发现,ans*=3;
code:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
int n;
ll ans=1;
char a[3][60];
int main(){
//freopen("paint.in","r",stdin);
//freopen("paint.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=2;i++)
for(int j=1;j<=n;j++)
cin>>a[i][j];
for(int j=1;j<=n;j++){
if(j==1){
if(a[1][j]==a[2][j]) ans*=3;
else{
ans*=6;
j++;
}
}
else {
if(a[1][j-1]==a[2][j-1]){
if(a[1][j]==a[2][j]) ans=(ans<<1)%mod;
else{
ans=(ans<<1)%mod;
j++;
}
}
else {
if(a[1][j]==a[2][j]) continue;
else{
ans=(ans*3)%mod;
j++;
}
}
}
}
printf("%lld",ans%mod);
}
C.mex
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
int n,T;
int x;
int sum;
bool f;
int main(){
scanf("%d",&T);
while(T--){
f=0,sum=0;
scanf("%d",&n);
for(int i=1;i<=n;i++) {
scanf("%d",&x);
if(x==0) sum++;
if(x>1) f=1;
}
if(sum==n) printf("1\n");
else if(sum>int(n/2.0+0.999999)){
if(f) printf("1\n");
else printf("2\n");
}
else printf("0\n");
}
}
D.luckey:
欧拉定理板题:
欧拉定理:如果gcd(a,p)==1,那么
code:
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long ll;
int cnt;
ll L;
ll gcd(ll x,ll y){return y?gcd(y,x%y):x;}
ll oula(ll m){
ll w=m;
for(int i=2;i*i<=m;i++){
if(m%i==0){
w-=w/i;
while(m%i==0)m/=i;
}
}
if(m>1)w-=w/m;
return w;
}
ll pow_mod(__int128 x , __int128 n , __int128 mod ){
__int128 ans = 1;
__int128 t = x % mod ;
while(n) {
if(n & 1){
ans =(ans*t)%mod;
}
t = (t*t)%mod;
n >>= 1 ;
}
return ans ;
}
int main () {
while(scanf("%lld",&L)&&L){
ll m=9*L/gcd(L,8);
printf("Case %d: ",++cnt);
if(gcd(m,10)==1){
ll num=oula(m);
ll sum=num;
for(ll i=1;i*i<=num;i++){
if(num%i==0){
if( pow_mod (10 , i , m)== 1) {
sum=min(sum, i);
break;
}
if( pow_mod(10 , num/i ,m)== 1) sum=min(sum, num/i);
}
}
printf("%lld\n",sum);
}
else printf("0\n");
}
}
E.grafun:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=100005;
const ll mod=1e9;
int n,m;
ll ans;
int fa[N];
ll sz[N],cost[N];
struct edge{
int u,v;
ll w;
}e[N];
bool cmp(edge a,edge b){return a.w>b.w;}
int find(int k){
if(k==fa[k]) return k;
else fa[k]=find(fa[k]);
return fa[k];
}
ll unite(int a,int b){
int ra=find(a),rb=find(b);
if(ra==rb) return 0;
else{
ll res=sz[ra]*sz[rb];
fa[ra]=rb;
sz[rb]+=sz[ra];
return res;
}
}
void kruskal(){
for(int i=1;i<=m;i++){
if(find(e[i].u)==find(e[i].v)) continue;
ans+=unite(e[i].u,e[i].v)*cost[i]%mod;
}
}
int main () {
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++) scanf("%d%d%lld",&e[i].u,&e[i].v,&e[i].w);
for(int i=1;i<=n;i++) fa[i]=i,sz[i]=1;
sort(e+1,e+1+m,cmp);
for(int i=m;i>0;i--) cost[i]=e[i].w+cost[i+1];
kruskal();
printf("%lld\n",ans%mod);
}
F.subset:
样例:
输入:
41
71
3
5
50
75
2
19
47
88
95
92
110
111
117
58
124
130
57
129
168
161
29
39
206
79
10
142
107
209
210
222
221
223
242
104
264
265
202
279
314
315
输出:
22
奇数一边,偶数一边,求二分图的最小独立子集
code:
#include<bits/stdc++.h>
#define fi first
#define se second
using namespace std;
typedef long long ll;
const ll mod=1e9+7;
const int N=505;
int n,res,cb,cc;
ll a[N],b[N],c[N];
bool e[N][N],vis[N];
int ff[N];
int cnl,cnr,cx[N],cy[N];
ll gcd(ll x,ll y) {return y?gcd(y,x%y):x;}
int path(int u){
int v;
for(v=0;v<cnr;v++){
if(e[u][v]&&!vis[v]){
vis[v]=1;
if(cy[v]==-1||path(cy[v])){
cx[u]=v;
cy[v]=u;
return 1;
}
}
}
return 0;
}
int main(){
//freopen("subset.in","r",stdin);
//freopen("subset.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++) {
scanf("%lld",&a[i]);
if(a[i]&1) b[++cb]=i;
else c[++cc]=i;
}
memset(ff,-1,sizeof ff);
for(int i=1;i<=cb;i++){
bool f=0;
for(int j=1;j<=cc;j++){
if(gcd(a[b[i]],a[c[j]])==1&&gcd(a[b[i]]+1,a[c[j]]+1)==1){
f=1;
if(ff[j]==-1) {
ff[j]=cnr;
e[cnl][cnr++]=1;
}
else{
e[cnl][ff[j]]=1;
}
}
}
if(f) cnl++;
}
memset(cx,-1,sizeof cx);
memset(cy,-1,sizeof cy);
for(int i=0;i<cnl;i++){
if(cx[i]==-1){
memset(vis,0,sizeof vis);
res+=path(i);
}
}
printf("%d\n",n-res);
}
qwq,只考了202pts,悲
本文来自博客园,作者:MegaSam,转载请注明原文链接:https://www.cnblogs.com/MegaSamTXL/p/17607134.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】