• 产生数


    题目描述

    给出一个整数 n(n<10^30) 和 k 个变换规则(k<=15)。

    规则:

    一位数可变换成另一个一位数:

    规则的右部不能为零。

    例如:n=234。有规则(k=2):

    2->5 3->6 上面的整数 234 经过变换后可能产生出的整数为(包括原数):

    234 534 264 564 共 4 种不同的产生数

    问题:

    给出一个整数 n 和 k 个规则。

    求出:

    经过任意次的变换(0次或多次),能产生出多少个不同整数。

    仅要求输出个数。

    输入输出格式

    输入格式:

    键盘输人,格式为:

    n k x1 y1 x2 y2 ... ...

    xn yn

    输出格式:

    屏幕输出,格式为:

    一个整数(满足条件的个数):

    输入输出样例

    输入样例#1: 复制
    234 2
    2 5
    3 6
    
    输出样例#1: 复制
    4
    

     【题解】传递闭包+高精

    DFS会TLE,所以想到可能性就要想到乘法原理

    #include<cstdio>
    #include<cstring>
    
    int d[20][20]= {0};
    int num[333],k,ans[33]= {0,1},len=1,cnt[10]= {0};
    char s[33];
    void cal(int b) {
        for(int i=1; i<=len; i++)
            ans[i]*=b;
        for(int i=1; i<=len; i++) {
            ans[i+1]+=ans[i]/10;
            ans[i]%=10;
        }
        while(ans[len+1]>0)len++;
        while(ans[len]==0&&len>1)len--;
    }
    int main() {
        int u,v;
        scanf("%s%d",s+1,&k);
        for(int i=1; i<=strlen(s+1); i++)
            num[i]=s[i]-'0';
        for(int i=1; i<=k; i++) {
            scanf("%d%d",&u,&v);
            d[u][v]=true;
        }
        for(int i=0; i<=9; i++)d[i][i]=true;
        for(int k=0; k<=9; k++)
            for(int i=0; i<=9; i++)
                for(int j=0; j<=9; j++)
                    d[i][j]|=d[i][k]&d[k][j];
        for(int i=0; i<=9; i++)
            for(int j=0; j<=9; j++)cnt[i]+=d[i][j];
        for(int i=1; i<=strlen(s+1); i++)
            if(cnt[num[i]])
                cal(cnt[num[i]]);
        for(int i=len; i>=1; i--)
            putchar(ans[i]+'0');
        puts("");
        return 0;
    }
  • 相关阅读:
    MySql-数据库基础
    Window安装MySQL
    Python程序中的进程操作-进程间通信(multiprocess.Queue)
    线程
    上传电影代码
    并发编程基础
    基于socketserver实现并发的socket编程
    模拟ssh远程执行命令
    GIT的使用,Pycharm中使用GitHub
    主机如何访问运行在虚拟机中的Django项目
  • 原文地址:https://www.cnblogs.com/kcfzyhq/p/8543635.html
Copyright © 2020-2023  润新知