Enlace del título
D. Walk on Matrix
Tema: Déle una k y le pida que construya una matriz de peso de n * m. Bob pregunta de acuerdo con este dp:
Y el verdadero máximo de ruta de esta matriz menos dp [n] [m] obtenido por Bob es igual a k.
Idea: Obviamente, deje que dp de Bob [n] [m] sea 0 y es mejor construir, solo necesito construir k para hacerlo. Después de pasar una página de borrador, finalmente descubrí cómo entender:
Sea len la longitud en k binario, que es exactamente un bit más grande que k.
m = 1 << len
k + mm mk
k m + kkk
Ruta de Bob: (1,1) (1,2) (2,2) (2,3) (2,4) El peso correspondiente es: k + m-> m-> m-> 0-> 0
La ruta correcta (1,1) (2,1) (2,2) (2,3) (2,4) corresponde a un peso de k + m-> k-> k-> k-> k
#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=(b);++i)
#define mem(a,x) memset(a,x,sizeof(a))
#define pb push_back
#define pi pair<int, int>
#define mk make_pair
using namespace std;
typedef long long ll;
ll gcd(ll a,ll b) { return b?gcd(b,a%b):a;}
const int N=5e2+10;
int dp[N][N],a[N][N],n,m,k;
int main()
{
n=2,m=4;
cin>>k;
int x=k,len=0;
while(x)++len,x=x/2;
a[1][4]=a[2][1]=a[2][3]=a[2][4]=k;
//len++;
a[1][2]=a[1][3]=1<<len;
int t=0;
a[1][1]=a[2][2]=a[1][2]+k;
printf("%d %d\n",n,m);
rep(i,1,n)
{
rep(j,1,m) printf("%d ",a[i][j]);
puts("");
}
}
/*
84306
*/
E. Altura igual
Tema: Déle n, m, l, r para preguntar cuántas matrices originales tiene, l <= a [i] [j] <= r Haga que la altura sea tan alta como las dos operaciones siguientes
1: elige un aumento de 2 alturas,
2: Elija dos para elevar una altura al mismo tiempo
Idea: No, solución de búsqueda: De: Este
De hecho, cuando n * m es par, y el número impar en la matriz es impar, y el número par es impar, es una matriz ilegal.
Luego use (r-l + 1) ^ (n * m) -legal
Ilegal =
(r-l + 1) ^ (n * m) - =
#include<bits/stdc++.h>
#define ll long long
#define mod 998244353
using namespace std;
ll n,m,l,r,ans;
ll ppow(ll a,ll x)
{
ll tans=1;
while(x)
{
if(x&1)tans=tans*a%mod;
a=a*a%mod;x>>=1;
}
return tans;
}
int main()
{
scanf("%lld%lld%lld%lld",&n,&m,&l,&r);
if((n*m)&1)ans=ppow(r-l+1,n*m);
else ans=(ppow(r-l+1,n*m)+ppow((r-l+2)/2-(r-l+1)/2,n*m))*ppow(2,mod-2)%mod;
printf("%lld\n",ans);
return 0;
}