Número de Luogu P1037 [grupo de popularização NOIP2002] produzido

Permutação e combinação QWQ

Quando vi essa pergunta pela primeira vez, K tinha apenas 15 anos? ? ? , então silenciosamente lançou uma busca violenta.
Com meu nível alto (la) super (ji), claro que é
TLE...
é só olhar para a tela, 70 linhas de código. . . .

Indo direto ao ponto:

É impossível fazer uma busca profunda.
Descoberta: o número total de esquemas não é multiplicado pelo número de esquemas para cada número?

Nota :

  1. Para os números a, b e c, se a pode se tornar b e b pode se tornar c, então a pode se tornar c . Como resolver isso? _____ ( fluxo de água ).
  2. Observe que (n < 1 0 30 10^{30}1 030 ). Então... alta precisão? (sim) não~ não~ não~, você pode usar __int128.

projeto de algoritmo:

  1. Leia, a propósito, armazene u e v na tabela bidimensional vis visv i s ,vis [ i ] [ j ] vis[i][j]v i s [ i ] [ j ] indica se i a j são variáveis.
  2. executar floyd novamente ;
  3. Armazene o número de grau externo do ponto i (0 <= i <= 9) no array be[].
  4. ans将be [i] be[i]b e [ i ] multiplicado um por um
  5. saída perfeita

Código AC:

#include <bits/stdc++.h>
using namespace std;
#define LL long long
#define rep(i,l,r) for(int i=l;i<=r;i++)
#define per(i,r,l) for(int i=r;i>=l;i--)
const int N = 100,INF=1e9,mod=INF+7;
int be[N];
bool vis[N][N];

__int128 read()
{
    
    
    __int128 f=1,w=0;
    char ch=getchar();
    while(ch<'0'||ch>'9')
    {
    
    
        if(ch=='-')
        f=-1;
        ch=getchar();
    }
    while(ch<='9'&&ch>='0')
    {
    
    
        w=w*10+ch-'0';
        ch=getchar();
    }
    return f*w;
}
void print(__int128 x)
{
    
    
    if(x<0)
    {
    
    
        putchar('-');
        x=-x;
    }
    if(x>9)print(x/10);
    putchar(x%10+'0');
}
int main()
{
    
    
	__int128 ans=1,n;
	int k,a,b;
	n = read();
	cin >> k;
	rep(i,1,k){
    
    
		cin >> a >> b;
		vis[a][b] = 1;
	}
	rep(k,0,9)rep(i,0,9)rep(j,0,9)if(i==j || (vis[i][k] && vis[k][j]))vis[i][j] = true;
	rep(i,0,9)
		rep(j,0,9)
			if(vis[i][j])be[i]++;	
	while(n){
    
    
		ans *= be[n%10];	
		n/=10;
	}
	print(ans);	
	return 0;
}

Lembre-se de gostar ~~

おすすめ

転載: blog.csdn.net/onlyfirer/article/details/126106351