产生数

产生数

 

 

#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,没门。

高精写个模板就行了,于是乎我又更了一道水题。

不过我入门的时候到卡了我很久。产生数

 

上一篇:[CF710E] Generate a String - dp,结论


下一篇:IDEA使用Mybatis-generator自动生成代码