首页 > 其他分享 >P1037 [NOIP2002 普及组] 产生数

P1037 [NOIP2002 普及组] 产生数

时间:2023-09-30 19:12:18浏览次数:33  
标签:普及 NOIP2002 int P1037 cin len vis num --

P1037 [NOIP2002 普及组] 产生数

解法1:
利用floyd寻找每位数字可变化的点

点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
string s;
int d[20][20];
int f[25];
int num[150];
int main() {
	cin >> s;
	int n = s.length();
	int q;
	cin >> q;
	while (q--) {
		int x, y;
		cin >> x >> y;
		d[x][y] = 1;//有一条x->y的边
	}
	for (int i = 0; i <= 9; i++) d[i][i] = 1;//自己到自己也算

	for (int k = 0; k <= 9; k++)
		for (int i = 0; i <= 9; i++)
			for (int j = 0; j <= 9; j++)
				d[i][j] = (d[i][j] || (d[i][k] && d[k][j]));//i能变化成j,则标记可行
	for (int i = 0; i <= 9; i++)
		for (int j = 0; j <= 9; j++)
			if (d[i][j]) f[i]++;//查询每个数字可以变化的数量
	num[1] = 1;//初始为1
	for (int i = 0; i < n; i++) {
		for (int j = 1; j < 100; j++) num[j] *= f[s[i] - '0'];//乘法
		for (int j = 1; j < 100; j++) {//高精度
			num[j + 1] += num[j] / 10;
			num[j] %= 10;
		}
	}
	int len = 110;
	while (len > 1 && !num[len]) len--;//去除前导0
	for (int i = len; i>=1; i--) cout << num[i];//逆序输出
	return 0;
}

方法2:
dfs寻找变化的数量

点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
string s;
int f[25],g[25],vis[25],q;
int num[150];
int ans;
void dfs(int n) {
	for (int i = 1; i <= q; i++) {
		if (f[i] == n && !vis[g[i]]) {//找到x->y,且y没有被访问过
			ans++;//变化+1
			vis[g[i]] = 1;//标记
			dfs(g[i]);//再从y开始寻找,是否有y->z的变化
		}
	}
}
int main() {
	cin >> s;
	int n = s.length();
	cin >> q;
	for(int i=1;i<=q;i++){
		int x, y;
		cin >> x >> y;
		f[i] = x, g[i] = y;//开两位数组,因为x可能会变化多个数字
	}
	num[1] = 1;
	for (int i = 0; i < n; i++) {
		memset(vis, 0, sizeof vis);//每次记得清空
		ans = 1;//开始时也要算上,顺便还原
		vis[s[i] - '0'] = 1;//标记已经变化过的点,防止产生环
		dfs(s[i] - '0');//深搜找能变化的个数
		for (int j = 1; j < 100; j++) num[j] *= ans;//乘法
		for (int j = 1; j < 100; j++) {
			num[j + 1] += num[j] / 10;
			num[j] %= 10;
		}
	}
	int len = 110;
	while (len > 1 && !num[len]) len--;
	for (int i = len; i>=1; i--) cout << num[i];
	return 0;
}

标签:普及,NOIP2002,int,P1037,cin,len,vis,num,--
From: https://www.cnblogs.com/bu-fan/p/17738117.html

相关文章

  • P1075 [NOIP2012 普及组] 质因数分解
    因为n是两个质数的乘积,所以直接暴力枚举,只要能被整除,直接输出因为是要求大的那个,所以从小到大枚举,输出商即可点击查看代码#include<bits/stdc++.h>usingnamespacestd;#defineLLlonglongintmain(){ LLn; cin>>n; for(inti=2;1LL*i*i<=n;i++){ if......
  • P1002 [NOIP2002 普及组] 过河卒
    P1002[NOIP2002普及组]过河卒基础DP卒只能向右/向下由此可得转移方程dp[i][j]=dp[i-1][j]+dp[i][j-1]卒不能走马能到的地方和马所在的地方则用一个数组标记马能到的地方和马所在的地方,在经过该点的时候跳过即可注意判断边界问题以及dp数组的初始化#include<bit......
  • P1060 [NOIP2006 普及组] 开心的金明
    P1060[NOIP2006普及组]开心的金明简单的01背包问题点击查看代码#include<bits/stdc++.h>usingnamespacestd;intf[30005];intmain(){ intn,m; cin>>n>>m; for(inti=1;i<=m;i++){ intv,p; cin>>v>>p; for(intj=n......
  • 洛谷P1058 [NOIP2008 普及组] 立体图
    写在前面题解更新较少,请勿嗔怪。本文粗鄙而简陋,要获得更好的阅读体验,请移步https://www.luogu.com.cn/problem/solution/P1058。NOIp普及组2008的第四题,题目网站https://www.luogu.com.cn/problem/P1058。关于题目[NOIP2008普及组]立体图题目描述小渊是个聪明的孩子,他经......
  • P1075 [NOIP2012 普及组] 质因数分解
    算法一根据唯一分解定理,小于\(n\)的最大的能整除\(n\)的整数一定就是答案,可以暴力枚举。时间复杂度\(O(n)\),实际得分\(60\)。算法二发现算法一不能通过的原因是较大的那个质数可能的取值范围太大了。而较小的那个质数一定小于等于\(\sqrtn\),我们枚举它即可。时间复......
  • [NOIP2012 普及组] 摆花
    [NOIP2012普及组]摆花[NOIP2012普及组]摆花题意有\(n\)个数,每种可以选\(0\lex_i\lea_i\)个,问有多少种方法可以使得\(\sum_{i=1}^nx_i=m\)。Solution1.深搜\(dfs\)显然可以先暴力深搜。#include"bits/stdc++.h"usingnamespacestd;constintmaxn=......
  • P1056 NOIP2008 普及组 排座椅
    \(P1056\)[\(NOIP2008\)普及组]排座椅题解先想一下算法:因为题目里出现了最优解,最好的方案关键字,所以一定会用贪心。然后从题目给的样例解释可以看到:如果相邻的两行有许多组说话的同学,那么在这两行中间加一条过道是非常划算的;同理,列也是如此。恍然大悟,只要找出划分哪些......
  • P2669 [NOIP2015 普及组] 金币
    题目背景NOIP2015普及组T1题目描述国王将金币作为工资,发放给忠诚的骑士。第一天,骑士收到一枚金币;之后两天(第二天和第三天),每天收到两枚金币;之后三天(第四、五、六天),每天收到三枚金币;之后四天(第七、八、九、十天),每天收到四枚金币……;这种工资发放模式会一直这样延续下去:当连......
  • P1009 [NOIP1998 普及组] 阶乘之和
    题目描述用高精度计算出 S=1!+2!+3!+\cdots+n!S=1!+2!+3!+⋯+n!(n\le50n≤50)。其中 ! 表示阶乘,定义为 n!=n\times(n-1)\times(n-2)\times\cdots\times1n!=n×(n−1)×(n−2)×⋯×1。例如,5!=5\times4\times3\times2\times1=1205!=5×4×3×2×1=......
  • 普及一点基础语法知识
    https://www.bilibili.com/read/cv25225883/ 作者:Larry想做技术大佬https://www.bilibili.com/read/cv25225883/出处:bilibili 公布下答案,以及,顺便普及一点基础语法知识。 eoplelieallthetime,it'sauniversalthing.这个句子的所谓“语法错误”,没那么容易分析,我......