【洛谷】【计数原理+Floyed】P1037 产生数
【题目描述:】
给出一个整数 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 产生数的更多相关文章
- 洛谷【P1004】方格取数
浅谈\(DP\):https://www.cnblogs.com/AKMer/p/10437525.html 题目传送门:https://www.luogu.org/problemnew/show/P ...
- 洛谷 P1066 2^k进制数
P1066 2^k进制数 题目描述 设r是个2^k 进制数,并满足以下条件: (1)r至少是个2位的2^k 进制数. (2)作为2^k 进制数,除最后一位外,r的每一位严格小于它右边相邻的那一位. ( ...
- 洛谷P1066 2^k进制数(题解)(递推版)
https://www.luogu.org/problemnew/show/P1066(题目传送) (题解)https://www.luogu.org/problemnew/solution/P106 ...
- 洛谷1066 2^k进制数
原题链接 大力猜结论竟然猜对了.. 对于一对\(k,w\),我们可以把\(w\)位划分成\(k\)位一段的形式,每一段就是转换成十进制后的一位,这个从题面的解释中应该可以理解. 先不考虑可能多出(即剩 ...
- 【洛谷】4317:花神的数论题【数位DP】
P4317 花神的数论题 题目背景 众所周知,花神多年来凭借无边的神力狂虐各大 OJ.OI.CF.TC …… 当然也包括 CH 啦. 题目描述 话说花神这天又来讲课了.课后照例有超级难的神题啦…… 我 ...
- BZOJ4299 & CC FRBSUM:ForbiddenSum & BZOJ4408 & 洛谷4587 & LOJ2174:[FJOI2016]神秘数——题解
https://www.lydsy.com/JudgeOnline/problem.php?id=4299 https://www.lydsy.com/JudgeOnline/problem.php? ...
- 洛谷P1066 2^k进制数
P1066 2^k进制数 题目描述 设r是个2^k 进制数,并满足以下条件: (1)r至少是个2位的2^k 进制数. (2)作为2^k 进制数,除最后一位外,r的每一位严格小于它右边相邻的那一位. ( ...
- 洛谷P1976 鸡蛋饼(Catalan数)
P1976 鸡蛋饼 题目背景 Czyzoiers 都想知道小 x 为什么对鸡蛋饼情有独钟.经过一番逼问,小 x 道出 了实情:因为他喜欢圆. 题目描述 最近小 x 又发现了一个关于圆的有趣的问题:在圆 ...
- 洛谷P1722 矩阵 II(Catalan数)
P1722 矩阵 II 题目背景 usqwedf 改编系列题. 题目描述 如果你在百忙之中抽空看题,请自动跳到第六行. 众所周知,在中国古代算筹中,红为正,黑为负…… 给定一个1*(2n)的矩阵(us ...
随机推荐
- [AHOI2008] 紧急集合
Description 欢乐岛上有个非常好玩的游戏,叫做"紧急集合".在岛上分散有N个等待点,有N-1条道路连接着它们,每一条道路都连接某两个等待点,且通过这些道路可以走遍所有的等 ...
- .net项目技术选型总结
做.net开发已经几年了,也参与开发了很多大大小小的项目,所以现在希望总结出一套开发.net项目的常用技术,也为以后做项目技术选型的时候作为参考. 数据库 小型项目:SQLite(工具) 中大型项目: ...
- IEnumerable、ICollection、IList、List之间的区别与方法介绍
区别 以下列出IEnumerable.ICollection.IList.List继承关系.(这里带有泛型,非泛型也是一样的关系) IEnumerable<T>: public inter ...
- javascript基础知识学习
javascript中几种基础函数的介绍 1.typeof 注意: ① typeof 是操作符,不是函数: ② typeof 操作符 接收一个参数,用来判断参数数据类型,存在六种返回值类型,非别是:u ...
- display: flex; 布局
废话不多说,供上我学习Flex布局的启蒙文章,一切的答案,尽在这里,仔细阅读,多多回味!保证你有所收获! http://www.ruanyifeng.com/blog/2015/07/flex-gra ...
- pygame中模块说明
参考博客:https://blog.csdn.net/qq_27717921/article/details/53231762 pygame模块概览 1.display模块 功能:生成windows窗 ...
- 洛谷P3722 [AH2017/HNOI2017]影魔(线段树)
题意 题目链接 Sol 题解好神仙啊qwq. 一般看到这种考虑最大值的贡献的题目不难想到单调数据结构 对于本题而言,我们可以预处理出每个位置左边第一个比他大的位置\(l_i\)以及右边第一个比他大的位 ...
- loadrunner 脚本开发-调用java jar文件远程操作Oracle数据库测试
调用java jar文件远程操作Oracle数据库测试 by:授客 QQ:1033553122 测试环境 数据库:linux 下Oracle_11g_R2 Loadrunner:11 备注:想学ora ...
- Android系统启动流程(一)解析init进程启动过程
整体流程大致如下: 1.init简介 init进程是Android系统中用户空间的第一个进程,作为第一个进程,它被赋予了很多极其重要的工作职责,比如创建zygote(孵化器)和属性服务等.in ...
- memcached分析
memcache介绍 memcache是一个高性能的分布式的内存对象缓存系统,用于动态Web应用以减轻数据库负担.它通过在内存中缓存数据和对象,来减少读取数据库的次数.从而提高动态.数据库驱动网站速度 ...