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;
    }
     
  • 相关阅读:
    神通广大的CSS3选择器
    CF1153E Serval and Snake【构造】
    CF1153F Serval and Bonus Problem 【期望】
    李超线段树学习笔记
    Luogu5327【ZJOI2019】语言【树上差分,线段树合并】
    Luogu4191 [CTSC2010]性能优化【多项式,循环卷积】
    Codeforces Round #564 比赛总结
    CF917D Stranger Trees【矩阵树定理,高斯消元】
    【CTS2019】珍珠【生成函数,二项式反演】
    斯特林数学习笔记
  • 原文地址:https://www.cnblogs.com/thmyl/p/7359388.html
Copyright © 2011-2022 走看看