[关闭]
@wsndy-xx 2018-05-13T15:37:09.000000Z 字数 727 阅读 854

Luogu 产生数

题解

题意

给出 个变换规则,形如 a->b 表示 可以变为 , 问一个数 的任意位上经过任意次的变换后能形成最多多少个新数。


组合问题
将所有位上的变化的方案相乘就是最后答案
变化方案有直接的和间接地,通过 可以求出。
然后高精相乘,必须用到高精。


Code

  1. #include <iostream>
  2. #include <string>
  3. using namespace std;
  4. string str;
  5. int k, vis[10][10], f[10], num[101];
  6. int main() {
  7. cin >> str >> k;
  8. while(k--) {
  9. int a, b;
  10. cin >> a >> b;
  11. vis[a][b] = true;
  12. }
  13. for(int i = 0; i <= 9; i ++) vis[i][i] = true;
  14. for(int k = 0; k <= 9; k ++)
  15. for(int i = 0; i <= 9; i ++)
  16. for(int j = 0; j <= 9; j ++)
  17. vis[i][j] = vis[i][j] || (vis[i][k] && vis[k][j]);
  18. for(int i = 0; i <= 9; i ++)
  19. for(int j = 0; j <= 9; j ++)
  20. if(vis[i][j]) f[i] ++;
  21. int len = 2;
  22. num[1] = 1;
  23. for(int i = 0; i < (int)str.length(); i++) {
  24. for(int j = 1; j <= 100; j ++) num[j] *= f[str[i] - '0'];
  25. for(int j = 1; j <= 100; j ++)
  26. if(num[j] >= 10) {
  27. num[j + 1] += num[j] / 10;
  28. num[j] %= 10;
  29. }
  30. while (num[len]) len ++;
  31. }
  32. for (int i = len - 1; i >= 1; i --) cout << num[i];
  33. return 0;
  34. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注