zoukankan      html  css  js  c++  java
  • 产生数

    题目描述

    给出一个整数 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;
    }
  • 相关阅读:
    STM32如何用LCD、OLED显示浮点数
    STM32F 系列芯片 容量文件选择 startup_stm32f10x_hd
    sprintf与浮点数表示
    VSCode安装、配置
    用IDEA编写Vue
    mychart.onclick点击一次,执行多次
    软件测试和软件项目的关系
    java list model转换
    几个Java常用库
    mysql json 数组查询
  • 原文地址:https://www.cnblogs.com/kcfzyhq/p/8543635.html
Copyright © 2011-2022 走看看