K尾相等数问题


描述

一个自然数K(2≤K),若存在自然数M和N(M大于N),使得K^M和K^N均大于或等于1000,且它们的末尾三位数相等,则称M和N是一对“K尾相等数”。

输入

输入包含若干个测试用例,每个测试用例占一行,为一个自然数K。

输出

对每个测试用例,用一行输出符合要求的最小M+N值。

样例输入

2

样例输出

120
//   在每隔1000后总有3位数相同的数  例如 1234    2234 后面的3位数字相同 “234”
#include <iostream>
using namespace std;
#define  len  1000 
int  a[1001];
int main()
{
 
	int m,s,k,flag;
	while(cin>>k)
	{
		s=1;flag=0;  //s用来存储2^n 和2^m
		memset(a,0,sizeof(a));
		if(k>=len)      //如果k>1000就取出后3位
		{
			k%=len;
			flag=1;  //标记一下
		}
		m=1;
		while(1)
		{
			s*=k;   
			if(s>=len || flag==1)  //当s>1000就进入循还
			{
				if(a[s%len]==0)   //将没有出现的项标记
					a[s%len]=m;    //找到第一个满足m
				else 
				{ 
					a[s%len]+=m;  //  如果下次在此处就是要找的n 退出循环
					break;          
				}
				flag=1;
			}
			if(s>=len)
				s=s%len;   //如果s>len  将s的范围 0--999;
			m++;     //用来找出 n m
		}
		cout<<a[s%len]<<endl;
	}
	return 0;
}



在网上找到以下测试数据:

测试数据:

25

125

1000

1234

111111

1000003

123454321

测试数据结果:

7

6

3

56

52

102

27 

 

 

首先,我们需要选择一个适当的素p,使得p比哈希表的大小(12)稍大一点。为了方便,我们选择p=13。 接下来,我们可以使用哈希函H(k)=key%p来将每个关键字k映射到哈希表A中的一个位置。如果该位置已经被占用,则使用线性探查法来解决冲突,即从该位置开始向后查找,直到找到一个空位置或者找到关键字k为止。 按照这个方法,我们可以将所有的关键字插入到哈希表A中: A[0]=15 A[1]=59 A[2]=30 A[3]=42 A[4]=53 A[5]=45 A[6]=76 A[7]=28 A[8]=89 A[9]=87 A[10]=73 下面是哈希表的示意图: | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |10 |11 |12 | |15 |59 |30 |42 |53 |45 |76 |28 |89 |87 |73 | | | 假设每个关键字的查找概率相等,那么查找成功时的ASL值可以通过以下公式计算: ASL = (1/n) * Σ(di+1),其中n为关键字的个,di为查找成功时关键字所在位置与查找位置之间的距离。 在这个例子中,n=11,我们可以尝试查找每个关键字,并计算出它们的ASL值: 关键字 | 查找位置 | 关键字位置 | di | di+1 | -------|--------|--------|-----|------| 15 | 0 | 0 | 0 | 1 | 73 | 10 | 10 | 0 | 1 | 59 | 1 | 1 | 0 | 1 | 42 | 3 | 3 | 0 | 1 | 53 | 4 | 4 | 0 | 1 | 89 | 8 | 8 | 0 | 1 | 45 | 5 | 5 | 0 | 1 | 30 | 2 | 2 | 0 | 1 | 28 | 7 | 7 | 0 | 1 | 87 | 9 | 9 | 0 | 1 | 76 | 6 | 6 | 0 | 1 | 根据公式,ASL = (1/11) * (1+1+1+1+1+1+1+1+1+1+1) = 1,因此查找成功时的平均查找长度为1。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值