Rodada de Forças de Código # 630 (Div. 2) (construção D, contagem de teoremas binomiais E)

Link do título

D. Andar na Matriz

Tópico: Dê-lhe um k e peça-lhe para construir uma matriz de peso de n * m. Bob pergunta de acordo com este dp:

E a verdadeira rota máxima desta matriz menos dp [n] [m] obtida por Bob é igual a k.

Idéia: Obviamente, deixe o dp [n] [m] de Bob ser 0 e é melhor construir, só preciso construir k para fazê-lo. Depois de passar uma página do rascunho, finalmente descobri como entender:

Seja len o comprimento em k binário, que é exatamente um pouco maior que k.

m = 1 << len

k + mm mk

k m + kkk

Rota de Bob: (1,1) (1,2) (2,2) (2,3) (2,4) O peso correspondente é: k + m-> m-> m-> 0-> 0

A rota correta (1,1) (2,1) (2,2) (2,3) (2,4) corresponde a um 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

Tópico: dê a você n, m, l, r para perguntar quantas matrizes originais você tem, l <= a [i] [j] <= r Faça a altura tão alta quanto as duas operações a seguir

1: Escolha um aumento de 2 alturas,

2: Escolha dois para elevar uma altura ao mesmo tempo

Idéia: Não, solução de pesquisa: De: Este

De fato, quando n * m é par, e o número ímpar na matriz é ímpar, e o número par é ímpar, é uma matriz ilegal.

Então use (r-l + 1) ^ (n * m) -ilegal

Ilegal =\ sum _ {i = 1, i = i + 2} ^ {n * m} O ^ {i} * E ^ {n * mi}

(r-l + 1) ^ (n * m) - \ sum _ {i = 1, i = i + 2} ^ {n * m} O ^ {i} * E ^ {n * mi}=

#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;
}

 

Publicado 519 artigos originais · elogiou 69 · 50.000+ visualizações

Acho que você gosta

Origin blog.csdn.net/qq_41286356/article/details/105255254
Recomendado
Clasificación