产生数(floyd)

如果1可以变换到2,2可以变换到3,那么1可以变换到3,这可以用Floyd算法,要注意一点的是,其它数不可以变换到零,而零可以变到其它数,
我的高精度算法一开始是错的,我的做法会导致进位的数也乘了s,在最后要处理carry,但要记得carry/10,不然会成死循环

#include<iostream>
#include<cstring>
using namespace std;
int f[20][20];
int cnt[50];
int main(){
string str;
int m;
cin>>str>>m;
for(int i=1;i<=m;i++){
int x,y;
cin>>x>>y;
f[x][y]=1;
}
for(int k=1;k<=9;k++){
for(int i=0;i<=9;i++){
for(int j=1;j<=9;j++){
if(f[i][k]&&f[k][j])f[i][j]=1;
}
}
}
for(int i=1;i<=9;i++)f[i][i]=1;
for(int i=0;i<=9;i++){
for(int j=1;j<=9;j++){
if(f[i][j])cnt[i]++;
}
}
cnt[0]++;
int a[1000]={0};
int len=1;
a[1]=1;
long long int ans=1;
for(int i=0;i<str.size();i++){
int s=cnt[str[i]-'0'];
int carry=0;
for(int j=1;j<=len;j++){
int temp=a[j]*s+carry;
a[j]=temp%10;
carry=temp/10;
}
while(carry)a[++len]=carry%10,carry/=10;
};
for(int i=len;i>=1;i--)cout<<a[i];
return 0;
}

浙公网安备 33010602011771号