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 :
- 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). - 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:
- 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.
- executar floyd novamente ;
- Armazene o número de grau externo do ponto i (0 <= i <= 9) no array be[].
- ans将be [i] be[i]b e [ i ] multiplicado um por um
- 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 ~~