【洛谷】【计数原理+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 ...
随机推荐
- JavaWeb学习 (十五)————JSP指令
一.JSP指令简介 JSP指令(directive)是为JSP引擎而设计的,它们并不直接产生任何可见输出,而只是告诉引擎如何处理JSP页面中的其余部分. 在JSP 2.0规范中共定义了三个指令: pa ...
- C# DataGrid 用法---极速入门测试
目标: 新手编程,只求DataGrid能运行起来,更多功能留在后面探讨. 步骤: 1.新建WPF文档 插入DataGrid控件. <Window x:Class="OASevl.Mai ...
- C#中的readonly跟const用法小结
总结一下常量和只读字段的区别: 由来: 笔者也是在看欧立奇版的<.Net 程序员面试宝典>的时候,才发现自己长久以来竟然在弄不清出两者的情况下,混用了这么长的时间.的确,const与rea ...
- Java集合之Hashtable源码分析
概述 Hashtable也是基于哈希表实现的, 与map相似, 不过Hashtable是线程安全的, Hashtable不允许 key或value为null. 成员变量 Hashtable的数据结构和 ...
- SQL Server 基本INSERT语句
1.基本INSERT语句,单行插入 如果没有列出列,则使一一对应. 2.多行插入 3.INSERT INTO ... SELECT 语句 要插入的语句是从其他表中查询出来的. 注意:数据类型得相同或者 ...
- C# 特性学习笔记
1.自己定义的特性 注意注释!!!!! 2.使用特性 3.特性的用处
- 微信跳一跳Python辅助无需配置一键操作
作者:NiceCui 本文谢绝转载,如需转载需征得作者本人同意,谢谢. 本文链接:http://www.cnblogs.com/NiceCui/p/8350329.html 邮箱:moyi@moyib ...
- The server quit without updating PID file (data mysql.pid)
(1)mysql的安装路径和运行路径 # whereis mysqld (2)PATH变量指定的路径中,搜索mysql的信息 # which mysqld (3)查看配置文件 # ...
- Linux 操作系统下的环境变量设置
Linux下的环境变量设置 by:授客 QQ:1033553122 1. 问题描述 linux输入命令时经常会出现提示:xxx:Command not found 2. 原因分析 Command ...
- 《Inside C#》笔记(五) 方法
方法用来体现类的行为. 一 相关概念 a) ref和out 通常一个方法只能返回一个值,但如果确实需要返回多个值时,可以使用ref或out.如果方法的参数被标注为ref或out,在调用该方法时,会传递 ...