luogu P1037 产生数

原题链接:https://www.luogu.org/problem/show?pid=1037

首先,我不知道标签的搜索是哪里来的,这明明就是个Floyd+乘法原理

首先0—9每个数自己想自己连边,然后读入给出的边,跑一边Floyd,因为此题并没有要求步数的要求,所以只需要记录能否到达即可。1为能到达。

然后统计每一个数字都能到达几个数字(本身也算),将所有结果乘起来,用高精度处理一下就好了

 

#include<cstdio>
#include<cstring>
int n,e[20][20];
int num[20],ans[50],l;
char a[50];
int main()
{
    scanf("%s %d",a,&n);
    for(int i=1;i<=n;i++)
    {
        int x,y;
        scanf("%d %d",&x,&y);
        e[x][y]=1;
    }
    for(int i=0;i<=9;i++) e[i][i]=1;
    for(int k=0;k<=9;k++)
    {
        for(int i=0;i<=9;i++)
        {
            for(int j=0;j<=9;j++)
            {
                if(e[i][k]==1&&e[k][j]==1) e[i][j]=1;
            }
        }
    }
    int len=strlen(a);
    for(int i=0;i<len;i++)
    {
        int s=a[i]-'0';
        for(int j=0;j<=9;j++)
        {
            if(e[s][j]==1) num[i]++;  
        }
    }
    ans[0]=1;
    for(int i=0;i<len;i++)
    {
        for(int j=0;j<=l;j++) ans[j]*=num[i];
        for(int j=0;j<=l;j++)
        {
            if(ans[j]>9)
            {
                ans[j+1]+=ans[j]/10;
                ans[j]%=10;
            }
        }
        if(ans[l+1]!=0) l++;
    }
    for(int i=l;i>=0;i--) printf("%d",ans[i]);
    return 0;
}

 

posted @ 2017-10-19 17:38  Excim  阅读(131)  评论(0编辑  收藏  举报