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

    思路:

    这道题考查乘法原理,是数论中的一部分。
    可以把它想成是一个有向图,举个例子,如图所示,我们把0~9之间的整数列举出来,作为变化的模子。
    2可以变成自身,2-->2
    3可以变成自身,3-->3;亦可以变成4,3-->4;由于4可以变成5,那么3变成4后也能变成5,3-->5
    另一个3同理
    4可以变成自身,4-->4;亦可以变成5,4-->5

    利用乘法原理,答案就是把所有点的出度乘起来,即1*3*3*2=18
    /*codevs1009 产生数*/
    #include<iostream>
    using namespace std;
    string n;
    int t,can[11][11];
    int main()
    {
        cin>>n>>t;
        int x,y;
        while(t--){cin>>x>>y,can[x][y]=1;}
        for(int k=0;k<10;k++)
           for(int j=0;j<10;j++)
               for(int i=0;i<10;i++)
                 if(i!=j&&j!=k&&i!=k)
                    if(can[i][k]==1&&can[k][j]==1)can[i][j]=1;
        long long sum=1;
        for(int i=0;i<n.length();i++)
        {
            int n1=n[i]-'0',change=1;
            for(int j=0;j<10;j++)
                if(can[n1][j]==1&&n1!=j)change++;
            sum*=change;
        }
        cout<<sum;
        return 0;
    }
     
  • 相关阅读:
    网站统计中的数据收集原理及实现
    启动hadoop报ERROR org.apache.hadoop.hdfs.server.namenode.FSImage: Failed to load image from FSImageFile
    淘宝(大数据库应用)--转载
    MapReduce作业的map task和reduce task调度参数
    Spark和Hadoop作业之间的区别
    分析MapReduce执行过程
    MapReduce框架Partitioner分区方法
    LVS+keepalived实现负载均衡
    Tomcat 详解
    linux Tomcat restart脚本简单版
  • 原文地址:https://www.cnblogs.com/thmyl/p/6053105.html
Copyright © 2011-2022 走看看