K尾数相等

原创 2012年03月23日 23:31:42

http://acm.nyist.net/JudgeOnline/problem.php?pid=212

K尾相等数

时间限制:3000 ms  |  内存限制:65535 KB
难度:1
描述
输入一个自然数K(K>1),如果存在自然数M和N(M>N),使得K^M和K^N均大于等于1000,且他们的末尾三位数相等,则称M和N是一对“K尾相等数”。下面请编程求出M+N最小的K尾相等数。
输入
第一行包含一个正整数T,T<10000,表示有T组数据;
随后有N行,每行包括一个整数K(K<2*10^10);
输出
对于输入的每个整数K,输出对应的M+N的最小值;
样例输入
1
2
样例输出
120
代码:
 
 
 
#include<stdio.h>
#include<string.h>
int a[1000];
int main()
{  
    int x,i,flag,k,t;
    scanf("%d",&x);
    while(x--)
    {   flag=0;
       memset(a,0,sizeof(a));
        scanf("%d",&k);
        if(k>=1000)
        {
            k=k%1000;flag=1;a[k]=a[k]+1;
        }
        	
          for(t=k,i=2; ;i++)
            {
                 k=t*k;
                 if(flag==1||k>=1000)
				 {   k%=1000;
					 a[k]+=i;
				    if(a[k]>i)break;
				 }
            }
        
        printf("%d\n",a[k]);
    }
    return 0;
}
                        
总结:摘抄自博客园:

题目分析:

解题:

无论拿到什么样的题目,把题目读懂是第一件必须做到的事情。然后是分析题目中的关键词语以及重点内容。

就上面的题目而言,我们必须注意到下面的要点:

1.四个要点量:K,M,N,1000,且K,M,N是自然数

2.K是M,N的底数,M,N是K的幂。

3.K^M 和 K^N都必须大于1000

4.K^M 和 K^N 末尾三位相等。

5.要输出的的是M+N的值

6.M>N(两个数不相等…人家不会让小聪明成功的,K^M当然和它自己相等)

分析

1.上面的要点中,1,2,3,5,6都是辅助条件,关键是弄清楚第4点。末尾三位相等是什么意思?比如 123456 末尾三位是 ‘456’ 而 45678 末尾三位则是‘678’。显然(虽然我也不喜欢在书上看到这个字眼,但是这里确实是很显然……),这里指的是10进制数的末尾3位,如何取末尾3位的数字?很显然( =.=! )将这个数字对1000求模就可以了。

2.仔细思考后,我们可以注意到,任何数对1000求模只有1000种可能(0~999),所以我们将K^Power 中的Power从1(为什么不是0?因为K^0=1<1000,而我们不考虑小于1000的情况,题解第3点)到1001逐个求值,总有相等的两个数字。因为结果只有1000种可能,但是有1001次求值,哪怕前1000次所求结果都不一样,最后一次的值必然与前面1000种其中的一种相等(相关知识:抽屉原理1)。

流程:

根据上面的理解和分析,解决流程大致如下:

1.获得K的大小

2.逐个求K^Power (Power= 1,2,3…….1001)的结果并记录下来

3.若在记录的时候发现之前该值已经出现过,那么上次记录该值时的Power值和本次尝试记录时的Power值就分别是N和M了

4.输出M+N

 

数据结构与设计技巧:

1.其实这个程序不需要什么数据结构,但是有一个技巧还是得提到一下,K^Power末尾的三位数字只可能是0~999中的一种,而我们如何记录哪一种结果曾经出现过?最好的方法是使用一个一维数组,维数刚好是1000,分别记录0~999每种情况出现时Power的值。存取的时候可以利用末尾三位数本身的值作为该数组的索引来进行(相关知识:重复计数2

2.其实我们也不需要逐个求K^Power的值,那样的运算效率太低了。考虑到 K^Power = K^(Power-1),所以,利用这一性质,我们可以求出K^1的值,然后据此推出K^2到K^1001的结果就行了。

   3. 当K或者Power比较大的时候它们相乘可能导致数据溢出,这就需要参考我的另一篇文章里的对大数进行求模运算的相关算法了,总之结果就是求M*N%R, 当M*N可能溢出时,应该使用 ((M%R)*(N%R))%R 来计算。

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

NYOJ - K尾相等数

K尾相等数 时间限制:3000 ms  |           内存限制:65535 KB 难度:1 描述 输入一个自然数K(K>1),如果存在自然数M和N(M>N...

WOJ1313-K尾数相等

  • 2014-02-08 17:07
  • 581B
  • 下载

尾数相等详解

描述输入一个自然数K(K>1),如果存在自然数M和N(M>N),使得K^M和K^N均大于等于1000,且他们的末尾三位数相等,则称M和N是一对“K尾相等数”。下面请编程求出M+N最小的K尾相等数。 ...

求K进制数尾数0的个数

Factorials Attack Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other...

K尾相等数

  • 2014-05-01 09:30
  • 561B
  • 下载

数论:k尾相等数

题目描述:从键盘输入一个自然数K(K>1),若存在自然数M和N(M>N),使得K^M和K^N均大于或等于1000,且他们末尾三位数相等,则称M和N是一对“K尾相等数”。编写一程序,输出M+N值最小的K...

nyoj-212-K尾相等数

K尾相等数 时间限制:3000 ms  |  内存限制:65535 KB 难度:1 描述输入一个自然数K(K>1),如果存在自然数M和N(M>N),使得K^M和K^N均大于等...

HDOJ1066-数学,N!的非零尾数

/* 求N!最后非0位的值。比如2是120的最后一个不是0的值。 输入N比较大,要大数保存。 注意到最后0的个数是与5的因数的个数相等。设f(n)为n!的最后非0位。 那么f(n)=((n%5)!* ...

Python数据挖掘课程 四.决策树DTC数据分析及鸢尾数据集分析

今天主要讲述的内容是关于决策树的知识,主要包括以下内容:         1.分类及决策树算法介绍         2.鸢尾花卉数据集介绍         3.决策...

自守数定义:一个自然数的平方的尾数等于该数本身。例如:25=625,76=5776,9376=87909376,则25、76、9376均是自守数。试建立一个类Self,求出指定范围内的自守

自守数定义:一个自然数的平方的尾数等于该数本身。例如:25=625,76=5776,9376=87909376,则25、76、9376均是自守数。试建立一个类Self,求出指定范围内的自守数,具体要求...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)