http://hi.baidu.com/nicker2010/item/4fa83c4c5050b3e5a4c066ec

另一个

Last non-zero Digit in N!

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)

Total Submission(s): 5695    Accepted Submission(s): 1416

Problem Description

The expression N!, read as "N factorial," denotes the product of the first N positive integers, where N is nonnegative. So, for example, 

N N! 

0 1 

1 1 

2 2 

3 6 

4 24 

5 120 

10 3628800 



For this problem, you are to write a program that can compute the last non-zero digit of the factorial for N. For example, if your program is asked to compute the last nonzero digit of 5!, your program should produce "2" because 5! = 120, and 2 is the last nonzero digit of 120.

Input

Input to the program is a series of nonnegative integers, each on its own line withno other letters, digits or spaces. For each integer N, you should read the value and compute the last nonzero digit of N!.

Output

For each integer input, the program should print exactly one line of output containing the single last non-zero digit of N!.

Sample Input

1 2 26 125 3125 9999

Sample Output

124828

Source

South Central USA 1997

数字是几许,若是用一般作法,先统计2和5的个数,然

,获得的将是TLE。所以还须要再做简化:

去掉,我们把所有的因数2和5都提出来,放到最后再处理惩罚。N!中的N个相乘的

数可以分成两堆:奇数和偶数。偶数相乘可以写成(2^M)*(M!),M=N DIV 2。M!可以

递归处理惩罚,是以如今只需评论辩论奇数相乘。推敲1*3*5*7*9*11*13*15*17* ... *N(若是

的倍数的有5,15,25,35,... ,可以此中的5提出来

,变成(5^P)*(1*3*5*7*9* ... ),后面括号中共P项,P=(N DIV 5+1) DIV 2,而后

出来,递归处理惩罚。如今剩下的数是1 * 3 * 7 * 9 * 11 * 13

* 17 * 19 * ... 。这些数我们只须要他们的个位数,因为(1 * 3 * 9 * 11 * 13

* ... ) MOD 10 = (1 * 3 * 7 * 9 * 1 * 3 * ... ) MOD 10。我们列出余数表,

1 3 1 9 9 7 9 1 1 3 1 9 9 7 9 ……。我们发明每八项MOD 10的成果是一个轮回。

和5须要乘入。把2和5配对完都是N

,看剩下的2有几个。若是有剩下的2,推敲2^N的个位数又是2 4 8 6 2 4

8 6 ……每四项一个轮回,找出这个个位数后,和前面的成果相乘,再取个位数就是

和5的身分别的处理惩罚,所以在所有的乘法中,都只须要策画个位数乘法,并且只保存个位数的成果。



但让我很惊奇的是:为什么我提交老是WA?后来我才知道,原因是这道题的N相当大

!达到了10^100!要用大数来处理惩罚!GPC四项编译开关全关的,天然查不出来!并且

上方这个算法换成大数后会很麻烦。还有什么此外好办法吗?

答案是有的。我们设F(N)默示N!的尾数。

的倍数提出来,用1庖代本来

的倍数全被提走了,所以如许就不会呈现尾数0了。我们先把

的倍数的地位上是1),可以获得table[0..9] =

, 1, 2, 6, 4, 4, 4, 8, 4, 6)。对于N < 5,直接输出table[N]即可;对于N >

,是以须要一个2与之配成10,即将尾数除以2。重视到除了0

!和1!,阶乘的最后一个非零数字必为偶数,所以有一个很特此外除律例律:2 / 2

。斗劲特别的就是2 / 2 = 12 / 2 = 6,

6 / 2 = 16 / 2 = 8。如许我们就可以获得如下式子:

代码:

               table[N]

F(N) = ------------ (0 <= N < 10)

               2^([N/5])

的倍数提出来,用1庖代原

的倍数的地位。因为5的倍数全被提走了,所以如许就不会呈现尾数0了。我们观

个数的乘积的尾数是6,

,是以我们将剩下的数每10个分成一组,则剩下的数的乘积的尾数

的倍数提出来了

的倍数,有几许个5,就须要有几许个2与之配成10,所

,最后就要除以几许个2。重视到除2的成果变更是4个一轮回,是以若是

,只须要除(A MOD 4)次2就可以了。A MOD 4只与A的最后两位数有关,很好求

的倍数,因为5已经全部处理惩罚掉了,就变成[N/5]!。于是,我们可以获得

一个递归关系:

代码:

               F([N/5]) * table[N的尾数] * 6

F(N) = ----------------------------------- (N > 10)

               2^([N/5] MOD 4)

可以用高精度加法做,乘2再除10即

可。全部算法相当奇妙,写起来也斗劲轻松。

为轮回节的

为轮回节的

开端

F([N/5]) * table[N的尾数] * 6

F(N) = ----------------------------------- (N > 10)

               2^([N/5] MOD 4)

为轮回节的

,2,6,4,2,2,4,2,8,4,4,8,4,6,8,8,6,8,2}

整体思路解决了

#include<stdio.h>

#include<string.h>

#define N 1000

int b[20]={1,1,2,6,4,2,2,4,2,8,4,4,8,4,6,8,8,6,8,2};

int main()

{

int len,ans,c,i,a[N];

char s[N];

while(scanf("%s",s)!=EOF)

{

len=strlen(s);

for(i=0;s[i]!='\0';i++)

a[i]=s[len-i-1]-'0';

ans=1;

while(len)

{

ans=ans*b[a[1]%2*10+a[0]]%10;//取后两位20的循环

for(c=0,i=len-1;i>=0;i--)//除于5

{

c=c*10+a[i];

a[i]=c/5;

c=c%5;

}

len-=!a[len-1];//将0去掉

}

printf("%d\n",ans);

}

return 0;

}

1066N !最右边非零数的更多相关文章

  1. 结尾非零数的奇偶性(问题来源于PythonTip)

    给你一个正整数列表 L, 判断列表内所有数字乘积的最后一个非零数字的奇偶性.如果为奇数输出1,偶数则输出0.. 例如:L=[2,8,3,50] 则输出:0 L = [2,8,3,50] c2 = 0 ...

  2. 蓝桥杯练习——C++输出阶乘的最右边一位非零数

    #include<iostream> #include<iomanip> using namespace std; #define M 10000 #define N 1000 ...

  3. 求n!最后一位非零数

    引子:求n!末尾0的个数 n!末尾的0来源只有2,5两个质数相乘.所以只需要考察n!中包含多少个2和多少个5.然后取其较小值即为所求.即ans=min(cnt(2),cnt(5)).而转念一想,cnt ...

  4. 最后一个非零数字(POJ 1604、POJ 1150、POJ 3406)

    POJ中有些问题给出了一个长数字序列(即序列中的数字非常多),这个长数字序列的生成有一定的规律,要求求出这个长数字序列中某个位上的数字是多少.这种问题通过分析,找出规律就容易解决. 例如,N!是一个非 ...

  5. n!最末尾非0数

    最小周期串:如果s是ss的周期串,那么ss就可以表示成几个周期的s,如果s是ss的最小周期串,那么s就是ss的周期串中最小的一个.例,ZgxZgxZgxZgx的最小周期串是Zgx.{很好理解} 给你一 ...

  6. Sql Server之数据类型详解

      数据类型是一种属性,用于指定对象可保存的数据的类型,SQL Server中支持多种数据类型,包括字符类型.数值类型以及日期类型等.数据类型相当于一个容器,容器的大小决定了装的东西的多少,将数据分为 ...

  7. Python之路-Day2

    二进制 1bit = 一个二进制位 8bit = 1byte 循环 for while 数据类型 数字.字符串.列表.元祖.字典.集合 字符编码 文件处理 for循环: for i in range( ...

  8. python第二天基础1-1

    一.作用域 对于变量的作用域,执行声明并在内存中存在,该变量就可以在下面的代码中使用. if 1==1: name = 'wupeiqi' print name 二.三元运算 result = 值1  ...

  9. Python2.3-原理之语句和语法

    此节来自于<Python学习手册第四版>第三部分 一.python语句简介(第10章) 1.首先记得一个概念:a.程序由模块构成:b.模块包含语句:c.语句包含表达式:d.表达式建立并处理 ...

随机推荐

  1. bzoj1494

    这道题不仅得看俞华程的论文,还得看陈丹琦的论文,否则是不可能做出来的.因为难点在构造矩阵上. 构造矩阵困难在如何表示状态,因为树不能有环,也不能不连通,这里我们引入了最小表示法来表示连续k个点的连通性 ...

  2. 8.4 IP地址的划分及子网划分

    都是比较灵活的一些计算题.只要掌握了其中的规则,还是比较容易解题的.在了解子网的划分如何进行之前呢,一定要弄清楚一个概念:子网掩码.这是弄清楚如何进行子网划分的一个关键. IP地址是四段二进制码拼合而 ...

  3. PCB 所建不凡 AWS 技术峰会2018 • 深圳站 2018.9.20

    在去[AWS 技术峰会2018 • 深圳站]之提前并没有AWS提前做功课,主要PCB这行业基本自己搭服务器搭应用,不会买云服务器.由于没用过企业级的云服务器,对云这方面还是了解还是非常有限的. 市面上 ...

  4. Codeforces Round #419

    A Karen and Morning 找最近的回文时间 模拟  往后推 判判就行 //By SiriusRen #include <bits/stdc++.h> using namesp ...

  5. flask web 表单验证 WTForms

    简介 WTForms 是一个flask集成框架,或者说是库,用于处理浏览器表单提交的数据,它在flask-WTF的基础上扩展并添加了一些随手可得的精巧帮助函数,这些函数将会是在flask里使用表单更加 ...

  6. 百度之星2017初赛B1006 小小粉丝度度熊

    思路: 考虑到补签卡一定是连续放置才更优,所以直接根据起始位置枚举.预先处理区间之间的gap的前缀和,在枚举过程中二分即可.复杂度O(nlog(n)). 实现: #include <iostre ...

  7. [Android]异常8-android.view.WindowManager$BadTokenException

    背景:Service服务中使用WindowManager时,Android4.4使用正常,Android6.0使用应用崩溃停止运行,提示android.view.WindowManager$BadTo ...

  8. Hive扩展功能(三)--使用UDF函数将Hive中的数据插入MySQL中

    软件环境: linux系统: CentOS6.7 Hadoop版本: 2.6.5 zookeeper版本: 3.4.8 主机配置: 一共m1, m2, m3这五部机, 每部主机的用户名都为centos ...

  9. 删除ListView item数据 页面不刷新

    最近碰到一个匪夷所思的事情.就是我删除listView中一条item数据  网络请求成功了 但是页面不成功,一番折腾 ,找到问题 ,原来我给item 添加了北京点击事假,又给listView 被禁设置 ...

  10. 用nginx实现分布式限流

    1.前言 一般对外暴露的系统,在促销或者黑客攻击时会涌来大量的请求,为了保护系统不被瞬间到来的高并发流量给打垮, 就需要限流 . 本文主要阐述如何用nginx 来实现限流. 听说 Hystrix 也可 ...