[洛谷P1037][题解]产生数

这道题的关键是利用Floyd算法的性质求转换方案,算是Floyd的一个变形,具体可以看代码。

题目

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 string n;
 4 int k;
 5 
 6 bool f[15][15];//表示数字之间是否能转换 
 7 inline void FLOYD()
 8 {
 9     /*
10     这里用Floyd算法枚举所有数对及中间的切点 
11     如果i能到k而k能到j
12     则说明i能到j 
13     */
14     for(int k=1;k<10;k++){
15         for(int i=0;i<10;i++){
16             for(int j=1;j<10;j++){
17                 if(f[i][k]&&f[k][j])f[i][j]=1;
18             }
19         }
20     }
21 }
22 
23 int cnt[15];
24 inline void SOLVE()
25 {
26     /*
27     计算每个数字能变为多少种 
28     */
29     for(int i=0;i<10;i++){
30         f[i][i]=1;
31         for(int j=0;j<10;j++){
32             if(f[i][j])cnt[i]++;
33         }
34     }
35 }
36 
37 int num[505];//高精警告
38  
39 int main()
40 {
41     ios::sync_with_stdio(0);
42     cin>>n>>k;
43     for(int i=1;i<=k;i++){
44         int x,y;
45         cin>>x>>y;
46         f[x][y]=1;
47     }
48      
49     FLOYD();
50     SOLVE();
51     
52     int c=0;
53     num[0]=1;
54     for(int i=0;n[i];i++){
55         c=0;
56         int ss=cnt[n[i]-'0'];
57         //万恶的高精 
58         for(int j=0;j<500;j++){
59             num[j]=num[j]*ss+c;
60             c=num[j]/10;
61             num[j]%=10;
62         }
63     }
64     //还是万恶的高精 
65     int i=500;
66     while(num[i]==0)i--;
67     for(;i>=0;i--)cout<<num[i];
68     cout<<endl;
69     return 0;
70 }
原文地址:https://www.cnblogs.com/juruoajh/p/11786000.html