CF1157A. Reachable Numbers

本文介绍了一个数学问题的解决方法,通过定义一个特殊函数f(x),该函数将输入x加1后去除所有末尾的0。文章探讨了如何从给定数字n出发,使用此函数转换成多个不同的数字,并详细解释了计算这些不同数字总数的算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Let's denote a function f(x)f(x) in such a way: we add 11 to xx , then, while there is at least one trailing zero in the resulting number, we remove that zero. For example,

  • f(599) = 6f(599)=6 : 599 + 1 = 600 \rightarrow 60 \rightarrow 6599+1=600606 ;
  • f(7) = 8f(7)=8 : 7 + 1 = 87+1=8 ;
  • f(9) = 1f(9)=1 : 9 + 1 = 10 \rightarrow 19+1=101 ;
  • f(10099) = 101f(10099)=101 : 10099 + 1 = 10100 \rightarrow 1010 \rightarrow 10110099+1=101001010101 .

We say that some number yy is reachable from xx if we can apply function ff to xx some (possibly zero) times so that we get yy as a result. For example, 102102 is reachable from 1009810098 because f(f(f(10098))) = f(f(10099)) = f(101) = 102f(f(f(10098)))=f(f(10099))=f(101)=102 ; and any number is reachable from itself.

You are given a number nn ; your task is to count how many different numbers are reachable from nn .

输入输出格式

输入格式:

 

The first line contains one integer nn ( 1 \le n \le 10^91n109 ).

 

输出格式:

 

Print one integer: the number of different numbers that are reachable from nn .

 

输入输出样例

输入样例#1
1098
输出样例#1: 
20
输入样例#2: 
10
输出样例#2:
19


题意:

有一个函数f(x)f(x),效果是将x+1x+1后,去掉末尾所有的00,例如:

f(599)=6f(599)=6,因为599+1=600→60→6599+1=600606

f(7)=8f(7)=8,因为7+1=87+1=8

f(9)=1f(9)=1,因为9+1=10→19+1=101

f(10099)=101f(10099)=101,因为10099+1=10100→1010→10110099+1=101001010101

我们可以多次进行函数f(x)f(x)的运算,从而让一个数xx转换为另一个数,例如1009810098可以转换为102102,因为f(f(f(10098)))=f(f(10099))=f(101)=102f(f(f(10098)))=f(f(10099))=f(101)=102。

你需要做的是给你一个数nn,求出nn经过多次函数f(x)f(x)的计算,能转换为几个不同的数(包括自身)?

思路:直接模拟即可,将这个数++,如果后面有0,将零去掉,当某个数字重复时一定会绕回去,所以此时终止就行

可以用c++ set中的insert函数,因为insert函数不会插入重复值,所以可以利用insert作为结束条件

 

代码实现

#include<cstdio>
#include<set>
#include<iostream>
using namespace std;
set<int>s;
int main()
{
	int x;
	cin>>x;
	s.insert(x);
	while(x != 0){
		x++;
		while(x % 10 == 0){  // 去掉0 
			x /= 10;
		}
		int n = s.size();
		s.insert(x);
		if(s.size() == n){  //判断终止的条件,一开始n与s.size()总是差着一个值,如果有重复条件则s.size()不增加,n就等于s.size()
			cout<<n<<endl;
			return 0;
		}
	}
}

  

转载于:https://www.cnblogs.com/clb123/p/10840999.html

<think>好的,我现在需要回答用户关于DGL库中`metapath_reachable_graph`函数的用法和示例的问题。首先,我需要确保自己理解这个函数的作用和适用场景。根据用户提到的,这可能与处理异构图(heterogeneous graphs)中的元路径(metapath)有关。 首先,我应该回忆DGL的文档中关于这个函数的描述。`metapath_reachable_graph`函数通常用于根据指定的元路径从原始异构图生成一个子图,这个子图只包含符合元路径的边。元路径是由节点类型和边类型交替组成的路径,例如“作者-论文-作者”(APA)这样的模式。这个函数可以帮助用户提取基于特定元路径的子图,用于后续的分析或模型输入,比如在异构图神经网络中。 接下来,我需要确认函数的具体参数和使用方法。通常,DGL的函数需要输入原始图、起始节点类型和元路径的定义。例如,元路径可能表示为边类型的列表。用户可能需要知道如何正确构造这个列表,以及如何处理返回的子图。 然后,我应该考虑用户可能的应用场景。例如,在学术图中,用户可能想通过APA元路径来发现合著关系。或者,在电商图中,用户可能通过“用户-商品-用户”(UBU)来寻找相似购买行为的用户。这时候,`metapath_reachable_graph`可以帮助生成这样的子图,进而进行社区发现或推荐任务。 接着,我需要考虑用户可能遇到的问题,比如如何定义元路径,如何处理节点类型,以及生成子图后的节点类型是否变化。例如,元路径中的边类型需要按照顺序排列,并且原始图中必须存在这些边类型,否则函数会报错。此外,生成的子图可能会将节点类型统一为元路径的起点类型,或者保持中间类型,需要具体看DGL的实现。 还需要注意,生成的子图可能是一个同构图(homogeneous graph),其中所有节点类型被统一,或者仍然保持异构图的结构,这取决于函数的实现。用户可能需要调整后续的处理步骤以适应子图的结构。 为了提供示例代码,我需要确保语法正确,并且符合DGL的最新版本。例如,构造一个异构图,添加节点和边,然后应用`metapath_reachable_graph`函数。然后展示如何提取APA元路径的子图,并检查结果中的边是否符合预期。 此外,需要提醒用户常见的错误,比如元路径定义错误、边类型不存在,或者起始节点类型不正确。例如,如果元路径的边类型顺序不符合图中的实际边,函数可能无法找到路径,导致生成的子图为空。 最后,要确保回答结构清晰,分步骤说明函数的用法,提供示例代码,并附上相关问题和引用。同时,引用用户提供的参考内容,比如引用[^2]中提到的优化器使用,可能在训练模型时会用到生成的子图,因此可以适当关联。</think>关于DGL库中`metapath_reachable_graph`函数的用法,以下是详细说明: ### 函数作用 `metapath_reachable_graph`用于在**异构图**(Heterogeneous Graph)中根据指定的**元路径**(metapath)提取满足路径条件的子图。元路径是由节点类型和边类型交替组成的模式(如`作者 -> 论文 -> 作者`),用于描述复杂语义关系[^1]。 ### 参数说明 ```python dgl.metapath_reachable_graph(g, metapath) ``` - **`g`**: 输入的异构图对象 - **`metapath`**: 元路径定义,格式为边类型列表(如`['author-paper', 'paper-author']`) ### 使用步骤 1. **构建异构图** 定义节点类型(如`author`, `paper`)和边类型(如`author-paper`, `paper-author`): ```python import dgl import torch g = dgl.heterograph({ ('author', 'author-paper', 'paper'): (torch.tensor([0,1]), torch.tensor([0,1])), ('paper', 'paper-author', 'author'): (torch.tensor([0,1]), torch.tensor([0,1])) }) ``` 2. **定义元路径** 例如提取`作者-论文-作者`(APA)关系的元路径: ```python metapath = ['author-paper', 'paper-author'] ``` 3. **生成子图** ```python sub_g = dgl.metapath_reachable_graph(g, metapath) print(sub_g.edges()) # 输出符合元路径的边 ``` ### 结果特性 - 返回的`sub_g`是**同构图**(Homogeneous Graph),节点类型被统一为元路径的起点类型(此处为`author`) - 边表示原始图中通过元路径连接的关系(如作者通过共同论文建立联系) ### 应用场景 1. **学术合著网络**:通过APA元路径发现潜在合作者 2. **推荐系统**:使用`用户-商品-用户`(UBU)元路径寻找相似用户 3. **社交网络分析**:分析`用户-帖子-用户`(UPU)传播路径 ### 常见问题解决 1. **空子图问题** 检查元路径定义是否符合图的边类型顺序,例如: ```python # 错误定义(边类型顺序颠倒) metapath = ['paper-author', 'author-paper'] # 正确应为['author-paper', 'paper-author'] ``` 2. **节点类型不匹配** 确保元路径首尾节点类型一致(如APA路径起点和终点均为`author`) 3. **权重继承** 若需保留原始边权重,需手动处理特征: ```python sub_g.ndata['feat'] = g.nodes['author'].data['feat'] ``` ### 示例代码 ```python # 构造异构图 g = dgl.heterograph({ ('author', 'writes', 'paper'): ([0,1,2], [0,0,1]), ('paper', 'cited_by', 'paper'): ([0,1], [1,2]) }) # 定义元路径:作者->论文->被引论文->作者(APPA) metapath = ['writes', 'cited_by', 'written_by'] # 需添加反向边类型 sub_g = dgl.metapath_reachable_graph(g, metapath) # 可视化结果 print("Subgraph edges:", sub_g.edges()) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值