#include <bits/stdc++.h> using namespace std; const int maxn = 1e5 + 10; string n; int k, g[10][10]; int d[10]; void floyd() { for (int k = 0;k <= 9;++k) { for (int i = 0;i <= 9;++i) { for (int j = 0;j <= 9;++j) { g[i][j] |= g[i][k] && g[k][j]; } } } } struct high { int a[maxn], len; void init() { len = 1; a[0] = 1; } void mul(int x) { for (int i = 0;i < len;++i) { a[i] *= x; } for (int i = 0;i < len;++i) { a[i + 1] += a[i] / 10; a[i] %= 10; } while (a[len]) { a[len + 1] += a[len] / 10; a[len] %= 10; ++len; } } void print() { for (int i = len - 1;i >= 0;--i) { printf("%d", a[i]); } } }; int main() { freopen("generate.in","r",stdin); freopen("generate.out","w",stdout); cin >> n >> k; for (int i = 1;i <= k;++i) { int u, v; scanf("%d%d", &u, &v); g[u][v] = 1; } for (int i = 0;i <= 9;++i) g[i][i] = 1; floyd(); for (int i = 0;i <= 9;++i) { for (int j = 0;j <= 9;++j) { d[i] += g[i][j]; } } high ans; ans.init(); for (int i = 0;i < n.size();++i) { int cur = n[i] - '0'; ans.mul(d[cur]); } ans.print(); }
要想知道答案,只需知道每个数能够间接转换成几个数,然后根据乘法原理×就行了。
如何知道,问就是floyd(),(还想让我写dfs,没门。
高精写个模板就行了,于是乎我又更了一道水题。
不过我入门的时候到卡了我很久。