【题目描述:】

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

规则:

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

规则的右部不能为零。

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

2 -> 5

3 -> 6

上面的整数 234 经过变换后可能产生出的整数为(包括原数):

234

534

264

564

共 4 种不同的产生数

【问题:】

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

求出:

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

仅要求输出个数。



[算法分析:]

读入一个整数a,每一位分别为\(a_1\), \(a_2\), \(a_3\),..., \(a_n\),

设置一个数组num,num[i]表示数字i有多少种变换,

于是答案为\(num[a_1] * num[a_2] * ... * num[a_n]\)。

写出来一看,发现在

1234 3

2 3

3 2

3 5

这组数据下的结果是错误的,

2变成3后,可以继续变成5,所以2能变成的值有两个

如何统计?

f[i][j]=1 表示数字i能变成数字j,对f数组做一遍Floyed,再遍历一遍f数组即可统计。



[Code:]

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std; int k;
long long num1[10];
bool a[10][10];
char n[31], ans[205], num[10][101]; int aa[205], b[205], c[205];
char ss[205];
//需用高精度
void Mul(char s1[], char s2[]) {
memset(ss, 0, sizeof(ss));
memset(aa, 0, sizeof(aa));
memset(b, 0, sizeof(b));
memset(c, 0, sizeof(c));
int lena=strlen(s1), lenb=strlen(s2); for(int i=0; i<lena; i++) aa[i] = s1[lena-i-1]-'0';
for(int i=0; i<lenb; i++) b[i] = s2[lenb-i-1]-'0';
for(int i=0; i<lena; i++)
for(int j=0; j<lenb; j++) {
c[i+j] += aa[i]*b[j];
c[i+j+1] += c[i+j]/10;
c[i+j] %= 10;
}
int lenc = lena+lenb;
while(lenc>1 && c[lenc-1]==0) lenc--; for(int i=lenc-1; i>=0; i--)
ss[lenc-i-1] = c[i] + '0';
} int main() {
for(int i=0; i<=9; ++i) num1[i] = 1;
scanf("%s%d", n, &k);
for(int i=1; i<=k; ++i) {
int x, y;
scanf("%d%d", &x, &y);
a[x][y] = 1;
}
for(int k=0; k<10; ++k)
for(int i=0; i<10; ++i)
for(int j=0; j<10; ++j)
a[i][j] |= (a[i][k] & a[k][j]);
for(int i=0; i<10; ++i)
for(int j=0; j<10; ++j)
if(a[i][j] && i!=j) {
++num1[i];
}
for(int i=0; i<10; ++i)
sprintf(num[i], "%lld", num1[i]);
int l = strlen(n);
ans[0] = '1';
for(int i=0; i<l; ++i) {
Mul(ans,num[n[i]-'0']);
strcpy(ans, ss);
}
cout << ans;
}

【洛谷】【计数原理+Floyed】P1037 产生数的更多相关文章

  1. 洛谷【P1004】方格取数

    浅谈\(DP\):https://www.cnblogs.com/AKMer/p/10437525.html 题目传送门:https://www.luogu.org/problemnew/show/P ...

  2. 洛谷 P1066 2^k进制数

    P1066 2^k进制数 题目描述 设r是个2^k 进制数,并满足以下条件: (1)r至少是个2位的2^k 进制数. (2)作为2^k 进制数,除最后一位外,r的每一位严格小于它右边相邻的那一位. ( ...

  3. 洛谷P1066 2^k进制数(题解)(递推版)

    https://www.luogu.org/problemnew/show/P1066(题目传送) (题解)https://www.luogu.org/problemnew/solution/P106 ...

  4. 洛谷1066 2^k进制数

    原题链接 大力猜结论竟然猜对了.. 对于一对\(k,w\),我们可以把\(w\)位划分成\(k\)位一段的形式,每一段就是转换成十进制后的一位,这个从题面的解释中应该可以理解. 先不考虑可能多出(即剩 ...

  5. 【洛谷】4317:花神的数论题【数位DP】

    P4317 花神的数论题 题目背景 众所周知,花神多年来凭借无边的神力狂虐各大 OJ.OI.CF.TC …… 当然也包括 CH 啦. 题目描述 话说花神这天又来讲课了.课后照例有超级难的神题啦…… 我 ...

  6. BZOJ4299 & CC FRBSUM:ForbiddenSum & BZOJ4408 & 洛谷4587 & LOJ2174:[FJOI2016]神秘数——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4299 https://www.lydsy.com/JudgeOnline/problem.php? ...

  7. 洛谷P1066 2^k进制数

    P1066 2^k进制数 题目描述 设r是个2^k 进制数,并满足以下条件: (1)r至少是个2位的2^k 进制数. (2)作为2^k 进制数,除最后一位外,r的每一位严格小于它右边相邻的那一位. ( ...

  8. 洛谷P1976 鸡蛋饼(Catalan数)

    P1976 鸡蛋饼 题目背景 Czyzoiers 都想知道小 x 为什么对鸡蛋饼情有独钟.经过一番逼问,小 x 道出 了实情:因为他喜欢圆. 题目描述 最近小 x 又发现了一个关于圆的有趣的问题:在圆 ...

  9. 洛谷P1722 矩阵 II(Catalan数)

    P1722 矩阵 II 题目背景 usqwedf 改编系列题. 题目描述 如果你在百忙之中抽空看题,请自动跳到第六行. 众所周知,在中国古代算筹中,红为正,黑为负…… 给定一个1*(2n)的矩阵(us ...

随机推荐

  1. Windows版本redis高可用方案探究

    目录 Windows版本redis高可用方案探究 前言 搭建redis主从 配置主redis-28380 配置从redis-23381 配置从redis-23382 将redis部署为服务 启动red ...

  2. U3D Transform用法

    最近在学习unity3d,下面对Transform类做一个小结 一.常用属性和方法 1.1 常用属性: 用代码展示一下上面的一些属性,值得注意的是myCube是mySphere的父物体 using U ...

  3. JavaScript之八皇后问题(递归)

      八皇后问题,是一个古老而著名的问题,该问题最早由国际西洋棋棋手马克斯·贝瑟尔(Max Bezzel)于1848年提出.八皇后问题的具体描述为:在\(8\times8\)的国际象棋上摆放8个皇后,使 ...

  4. Java学习笔记之——break 和continue

    break:(中文翻译:打断) 可以使用在switch和循环结构中 表示的含义:立刻结束当前switch或者或者循环结构 continue:(中文翻译:继续) 只可以使用在循环结构中 表示含义:结束本 ...

  5. 【协议】3、HTTP 协议入门

    HTTP 协议是互联网的基础协议,也是网页开发的必备知识,最新版本 HTTP/2 更是让它成为技术热点. 本文介绍 HTTP 协议的历史演变和设计思路. 一.HTTP/0.9 HTTP 是基于 TCP ...

  6. (三)Sass和Compass--制作精灵图片

    6.1 精灵的工作原理 // 将各种图片合并到一张图片里面,并在不同的状态下改变背景图片的位置; 6.2 精灵的重要性 // 压缩图片的内存; // 减少HTTP请求 6.2.3 Compass处理精 ...

  7. BZOJ1278: 向量vector(计算几何 随机化乱搞)

    题意 题目链接 Sol 讲一下我的乱搞做法.... 首先我们可以按极角排序.然后对\(y\)轴上方/下方的加起来分别求模长取个最大值.. 这样一次是\(O(n)\)的. 我们可以对所有向量每次随机化旋 ...

  8. wepy里面两种不同的写回调函数的方法

    方案一const getHelpCenter = createAction(GET_HELP_CENTER, () => request('api/hisense/article/menu/li ...

  9. Microsoft Dynamics CRM 9.0 OP 版本 移动端

    本次OP 版本做了架调整,新的移动端基本可以满足客户需求,其内容自己可配置选择,满足了一般企业的应用处理. 具体操作如下: 1.登录APP选择应用(我使用手机浏览器) 2.打开默认应用,现在就一个木得 ...

  10. 安卓开发_深入理解Activity和Fragment的关系

    Fragment(碎片)是必须嵌入在 Activity(活动) 中使用的.Fragment的生命周期随着Activity的生命周期的变化而变化 一.首先让我们看下Activity和Fragment的生 ...