产生数(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;
}
posted @ 2025-02-18 22:30  郭轩均  阅读(16)  评论(0)    收藏  举报