luogu_1037 产生数

#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
char a[32];
int k,in[15],ans[1010];
bool d[15][15],vis[15];

void mul(int x){
    for(int i=ans[0];i;i--){
        ans[i]*=x;
        ans[i+1]+=ans[i]/10;
        ans[i]%=10;
    }
    for(int i=1;i<=ans[0];i++)ans[i+1]+=ans[i]/10,ans[i]%=10; 
    while(ans[ans[0]+1])ans[0]++;
}

int dfs(int now){
    int sum=1;
    vis[now]=1;
    for(int i=1;i<=9;i++)
        if(d[now][i] && !vis[i])sum+=dfs(i);
    return sum;
}

int main(){
    ans[0]=ans[1]=1;
    scanf("%s%d",&a,&k);
    while(k--){
        int u,v;
        scanf("%d%d",&u,&v);
        d[u][v]=1;
    }
    for(int i=0;i<=9;i++){
        memset(vis,0,sizeof(vis));
        in[i]=dfs(i);
    }
    for(int i=0;i<strlen(a);i++)mul(in[a[i]-'0']);
    for(int i=ans[0];i;i--)printf("%d",ans[i]);
    puts("");
    return 0;
}

  

 

原文地址:https://www.cnblogs.com/codetogether/p/7652448.html