[洛谷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 }
内容来自_ajthreac_的博客(https://www.cnblogs.com/juruoajh/),未经允许,不得转载。