Afirmación : Probablemente el título es del área de discusión de Niu Ke. La entrada, la salida y el rango de datos del título también son un poco desconocidos. Solo mire las ideas. Estos detalles no importan QAQ. Corríjame si hay un error ~
Prueba escrita de Ali 3.23
Tema uno (potencia rápida)
Elija cualquier número de personas de n personas para formar un equipo, y luego seleccione un capitán de un equipo. Los diferentes capitanes cuentan diferentes combinaciones. Pida el número de tales combinaciones para tomar 10 ^ 9 + 7.
Rango de datos: 1 <= n <= 1000000000;
Idea: la respuesta es
, elija uno para ser el líder, y los otros tienen 2 opciones.
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int mod = 1e9+7;
int quickp(ll a,ll p) {
ll res = 1;
while(p) {
if(p&1) res = res*a%mod;
a = a*a%mod;
p >>= 1;
}
return res;
}
int main() {
ll n;
scanf("%lld",&n);
printf("%lld\n",n*quickp(2LL,n-1)%mod);
}
Tema 2 (BFS)
Un mapa n * m contiene 1 punto inicial y 1 punto final Otros puntos incluyen puntos alcanzables e inalcanzables. Cada vez que puede: moverse hacia arriba, hacia abajo, hacia la izquierda o hacia la derecha, o usar 1 energía para moverse de (i, j) a (n-1-i, m-1-j) instantáneamente, puede usar hasta 5 energías.
Rango de datos: 2 <= n, m <= 500;
输入:
4 4
#S..
E#..
....
....
输出:
4
解释:S(0,1)先瞬移到(3, 2),然后往上一步,往右一步,瞬移到E,一共4步
Idea: BFS
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 510;
int n,m;
char s[maxn][maxn];
bool vis[maxn][maxn];
struct node{
int x,y,step;
int count;
}cur,tmp;
bool check(int x,int y) {
if(x<0 || x>=n || y<0 || y>= m) return 0;
if(s[x][y] == '#') return 0;
return 1;
}
int dx[4] = {0,0,1,-1};
int dy[4] = {1,-1,0,0};
int bfs(int sx,int sy) {
cur.x = sx;cur.y = sy;
cur.step = 0;cur.count = 5;
queue<node> q;
int x,y;
vis[sx][sy] = 1;
q.push(cur);
while(!q.empty()) {
cur = q.front();
q.pop();
if(s[cur.x][cur.y] == 'E') return cur.step;
for(int i = 0;i < 4;++i) {
x = cur.x+dx[i];
y = cur.y+dy[i];
if(!check(x,y) || vis[x][y]) continue;
tmp = cur;
tmp.x = x;tmp.y = y;
tmp.step++;
q.push(tmp);
}
x = n-1-cur.x;
y = m-1-cur.y;
if(!check(x,y) || vis[x][y]) continue;
cur.x = x;cur.y = y;
cur.step++;cur.count--;
q.push(cur);
}
return -1;
}
int main() {
scanf("%d%d",&n,&m);
int x,y;
for(int i = 0;i < n;++i) {
scanf("%s",s[i]);
for(int j = 0;j < m;++j) {
if(s[i][j] == 'S') {
x = i;y =j;
break;
}
}
}
printf("%d\n",bfs(x,y));
}
/*
4 4
#S..
E#..
....
....
4
*/