【暴力】 会长爱数学 校OJ2346

本文介绍了一种基于特定数学运算F(X)的循环节大小计算方法,通过实例详细解释了如何计算给定数字X的循环节大小G(X),并提供了一个完整的C++实现代码。

题目描述

会长不仅是个爱晨刷的girl,也特别喜欢数学呢。然而她已经不满足于高数线代这些简单玩意了,
她要自己定义一种运算改变世界!有一天她垂死梦中惊坐起,突然就想到了一种新的运算F(X)。
如F(123)=1*2+2*3+3*1=11。她发现对于所有的数字来说不停的运用 F 函数会进入一个循环,例如
F(123)=11,F(11)=2, F(2)=4 ,F(4)=16, F(16)=12 ,F(12)=4,循环节的大小就是3。

现在,我们定义 X 的循环节大小为 G(X) 。
现在会长要用自己的方法考验你,给你一个 X ,请你计算G(X)。

如果不知道循环节是什么,请看两个例子:

如果输入了4,你应该输出3
F(4)=16, F(16)=12 ,F(12)=4,F(4)=16... ...
F(4)=16, F(16)=12 ,F(12)=4 为循环节,所以循环节长度为3,即G(4)=3。

如果输入了123,你应该输出3
F(123)=11,F(11)=2, F(2)=4 ,F(4)=16, F(16)=12 ,F(12)=4,F(4)=16... ...
F(4)=16, F(16)=12 ,F(12)=4 为循环节,所以循环节长度为3,即G(123)=3。

输入

多组测试数据,每组测试数据输入一个整数x(x<=1000000)

输出

对于每组测试数据,输出一个整数,代表 G(x)。 

样例输入

1
4

样例输出

1
3


#include <bits/stdc++.h>
using namespace std;

int seat[1000];

int main()
{
	int x;
	while (~scanf ("%d", &x) )
	{
		memset(seat,-1,sizeof(seat));
		for(int i=0;;i++)
		{
			int t=-1;
			int ch[10];
			memset(ch,0,sizeof(ch));

			while (x)
			{
				t++;
				ch[t] = x % 10;
				x /= 10;
			} //将x按位存入ch[]

			int num=0;
			for(int i=0;i<t;i++)
				num+=ch[i]*ch[i+1];
			num+=ch[0]*ch[t];

			if(seat[num]!=-1)
			{
				printf("%d\n",i-seat[num]);
				break;
			}
			else  //标记num的位置
			{
				seat[num]=i;
				x=num;
			}
		}
	}
	return 0;
}

### 关于SDUT 离散数学 OJ 实验一 以下是基于提供的引用内容以及相关知识整理的关于 **SDUT 离散数学 OJ 实验一** 的题目描述及其解答方法。 --- #### 题目解析与实现方案 实验一通常涉及离散数学的基础概念,例如双射判断、幺元和逆元计算等内容。以下是对几个典型题目的分析: 1. **双射判定问题** - 描述:给定两个集合 \( A \) 和 \( B \),以及它们之间的映射关系,判断该映射是否为双射。 - 判断条件: - 映射需满足单射(injective),即对于任意不同的 \( x_1, x_2 \in A \),有 \( f(x_1) \neq f(x_2) \)[^1]。 - 映射还需满足满射(surjective),即对于每一个 \( y \in B \),存在至少一个 \( x \in A \) 使得 \( f(x) = y \)。 - 解法思路: - 使用哈希表记录映射关系,验证是否存在重复值或未被覆盖的目标值。 - Python代码示例: ```python def is_bijection(n, m, k, mapping): from collections import defaultdict domain_set = set() codomain_set = set(range(1, m + 1)) value_count = defaultdict(int) for i in range(k): x, y = mapping[i] if y not in codomain_set or x in domain_set: return "NO" domain_set.add(x) value_count[y] += 1 # Check surjectivity and injectivity if len(domain_set) != n or any(count != 1 for count in value_count.values()): return "NO" return "YES" # 输入样例处理逻辑省略... ``` 2. **幺元与逆元计算** - 描述:定义一种二元运算 \( * \),其形式为 \( a*b = a+b-k \),求解代数系统的幺元和任一元素的逆元[^2]。 - 计算过程: - 幺元 \( e \) 定义为满足 \( a*e = a \) 的唯一元素,则可得方程 \( a+k-e=a \Rightarrow e=k \)。 - 对于任意元素 \( a \),其逆元 \( b \) 应满足 \( a*b=e \),即 \( a+b-k=k\Rightarrow b=2k-a \)[^2]。 - Python代码示例: ```python def find_identity_and_inverse(a_list, k): identity_element = k inverse_elements = {a: (2*k - a) for a in a_list} return identity_element, inverse_elements # 测试用例 result = find_identity_and_inverse([1, 2, 3], 5) print(f"Identity Element: {result[0]}") print(f"Inverse Elements: {result[1]}") ``` 3. **补图最大度与最小度** - 描述:已知无向图的邻接矩阵表示方式,求取对应完全图下的相对补图的最大度和最小度[^4]。 - 方法概述: - 构造原图对应的完全图邻接矩阵; - 将两者的差作为新图的邻接矩阵; - 统计各顶点的度并找到极值。 - Python代码片段: ```python def complement_graph_degrees(adj_matrix): n = len(adj_matrix) complete_adj = [[1]*n for _ in range(n)] for i in range(n): complete_adj[i][i] = 0 comp_adj = [] for i in range(n): row = [(complete_adj[i][j]-adj_matrix[i][j]) for j in range(n)] comp_adj.append(row) degrees = [sum(comp_adj[i]) for i in range(n)] max_degree = max(degrees) min_degree = min(degrees) return max_degree, min_degree ``` --- #### 输出结果说明 上述代码实现了针对不同类型的离散数学问题的具体解决方案,并通过合理的算法设计保证了时间复杂度的有效控制。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值