Last non-zero Digit in N! HDU - 1066

题意:

求n!的最后一位非零数。

题目:

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 with no 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

1
2
4
8
2
8

分析:参考

我们发现n!末尾的0都是通过5和2想成得到的,为了把0去掉,我们把所有的因数2和5都提出来,放到最后再处理。

  1. N!中的N个相乘的数可以分成两堆:奇数和偶数。偶数相乘可以写成(2M)∗(M!)(2^M)*(M!)(2M)(M!)M=N/2M=N/2M=N/2。M!可以递归处理,因此现在只需讨论奇数相乘。
  2. 考虑1∗3∗5∗7∗9∗11∗13∗15∗17∗...∗N1*3*5*7*9*11*13*15*17*...*N1357911131517...N(如果N为偶数则是N-1),这里面是5的倍数的有5,15,25,35,…,可以其中的5提出来,变成(5P)∗(1∗3∗5∗7∗9∗...)(5^P)*(1*3*5*7*9* ...)(5P)(13579...),后面括号中共P项,P=(N/5+1)/2P=(N/5+1) /2P=(N/5+1)/2,而后面的括号又可以继续提5出来,递归处理.现在剩下的数是1∗3∗7∗9∗11∗13∗17∗19∗....1*3*7*9*11*13*17*19*....137911131719....这些数我们只需要他们的个位数,因为(1∗3∗9∗11∗13∗...)mod(1*3*9*11*13* ...)mod(1391113...)mod 10=(1∗3∗7∗9∗11∗13∗...)mod10=(1*3*7*9*11*13*...)mod10=(13791113...)mod 10.10.10.我们列出余数表,1 3 1 9 9 7 9 1 1 3 1 9 9 7 9 ……。我们发现每八项modmodmod 10的结果是一个循环.
  3. 算出奇数的结果后,我们再回头看统计了多少个2和5需要乘入。把2和5配对完都是N!后面的0,看剩下的2有几个。如果有剩下的2,考虑2^N的个位数又是2 4 8 6 2 4 8 6 ……每四项一个循环,找出这个个位数后,和前面的结果相乘,再取个位数就是答案。由于我们完全把2和5的因素另外处理,所以在所有的乘法中,都只需要计算个位数乘法,并且只保留个位数的结果。
  4. 由于是很大的数(前面三个点都可以不看Q—Q
    我们设F(N)表示N!的尾数。
    先考虑简单的。考虑某一个N!(N < 10),我们先将所有5的倍数提出来,用1代替原来5的倍数的位置。由于5的倍数全被提走了,所以这样就不会出现尾数0了。我们先把0−90-909的阶乘的尾数列出来(注意,5的倍数的位置上是1),可以得到table[0—9]=(1, 1, 2, 6, 4, 4, 4, 8, 4, 6)。对于N < 5,直接输出table[N]即可;对于N>=5,由于提出了一个5,因此需要一个2与之配成10,即将尾数除以2。注意到除了0!和1!,阶乘的最后一个非零数字必为偶数,所以有一个很特别的除法规律:2/2=6,4/2=2,6/2=8,8/2=42/2=6,4/2=2,6/2=8,8/2=42/2=6,4/2=2,6/2=8,8/2=4。比较特殊的就是2/2=12/2=6,6/2=16/2=82/2=12/2=6,6/2=16/2=82/2=12/2=6,6/2=16/2=8.这样我们就可以得到如下式子:F(N)={2N/5table[N](0<=N<10)F(N)=\left \{ ^{table[N]}_{ 2^{N/5}} \right.(0 <= N < 10)F(N)={2N/5table[N](0<=N<10)
  • 再考虑复杂的。考虑某一个N!(N>=10),我们先将所有5的倍数提出来,用1代替原来5的倍数的位置。由于5的倍数全被提走了,所以这样就不会出现尾数0了。我们观察一下剩下的数的乘积的尾数,通过table表,我们发现这10个数的乘积的尾数是6,6*6的尾数还是6,因此我们将剩下的数每10个分成一组,则剩下的数的乘积的尾数只与最后一组的情况有关,即与N的最后一位数字有关。(因为根据最后一位就能知道它在尾数表中处于第几个位置,只要将尾数表之前的数相乘就得到最后一组的尾数。)由于我们把5的倍数提出来了,N!中一次可以提出[N/5]个5的倍数,有多少个5,就需要有多少个2与之配成10,所以有多少个5,最后就要除以多少个2。注意到除2的结果变化是4个一循环,因此如果有A个5,只需要除(A MOD 4)次2就可以了。A MOD 4只与A的最后两位数有关,很好求算。剩下的5的倍数,由于5已经全部处理掉了,就变成[N/5]!。于是,我们可以得到
    一个递归关系:
    F(N)={2[N/5]mod4F[N]∗table[N的尾数]∗6(N>10)F(N)=\left \{ ^{F[N]*table[N的尾数]*6}_{ 2^{[N/5] mod 4}} \right.(N >10)F(N)={2[N/5]mod4F[N]table[N]6(N>10)
    这样我们就得到了一个O(log5(N))的算法,整除5可以用高精度加法做,乘2再除10即可。整个算法相当巧妙。

AC代码:

#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
const int M=1e3+10;
const int mp[20]= {1,1,2,6,4,2,2,4,2,8,4,4,8,4,6,8,8,6,8,2};
char s[M];
int main()
{while(~scanf("%s",s)){int n=strlen(s),ret=1,a[M];if(n==1)printf("%d\n",mp[s[0]-'0']);else{for(int i=0; i<n; i++)a[i]=s[n-1-i]-'0';while(n>1){if(a[n-1]==0)n--;ret=ret*mp[a[1]%2*10+a[0]]%5;int num=0;for(int i=n-1; i>=0; i--)//num=num/5{num=num*10+a[i];a[i]=num/5;num%=5;}}printf("%d\n",ret+ret%2*5);}}return 0;
}

如何求n!中5的个数

int get5(int n)//计算n!中质因子5的出现次数
{if(n==0)return 0;return n/5+get5(n/5);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/309342.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

我们是如何做DevOps的?

一、DevOps的理解DevOps的概念理解DevOps 的概念在软件开发行业中逐渐流行起来。越来越多的团队希望实现产品的敏捷开发&#xff0c;DevOps 使一切成为可能。有了 DevOps &#xff0c;团队可以定期发布代码、自动化部署、并将持续集成 / 持续交付作为发布过程的一部分。一句话概…

word文档相关使用

主要是为了记忆&#xff0c;有的时候&#xff0c;之前查阅过&#xff0c;后来使用又忘记了&#xff0c;以后碰了就陆续添加吧&#xff0c;先开一个博文 文章目录插入图片&#xff0c;显示不全的问题&#xff1a;方法一&#xff1a;方法二&#xff1a;方法三&#xff1a;在左侧显…

[JavaWeb-XML]XML概述

XML&#xff1a; 1. 概念&#xff1a;Extensible Markup Language 可扩展标记语言* 可扩展&#xff1a;标签都是自定义的。 <user> <student>* 功能* 存储数据1. 配置文件2. 在网络中传输* xml与html的区别1. xml标签都是自定义的&#xff0c;html标签是预定义。…

调试实战 —— dll 加载失败之 Debug Release争锋篇

缘起 最近&#xff0c;项目里遇到一个 dll 加载不上的问题。实际项目比较复杂&#xff0c;但是解决后&#xff0c;又是这么的简单&#xff0c;合情合理。本文是我使用示例工程模拟的&#xff0c;实际项目中另有玄机&#xff0c;但问题的本质是一样的。本文从行文上与 《调试实战…

汉诺塔 X HDU - 2511

题目&#xff1a; 1,2,…,n表示n个盘子&#xff0e;数字大盘子就大&#xff0e;n个盘子放在第&#xff11;根柱子上&#xff0e;大盘不能放在小盘上&#xff0e;在第&#xff11;根柱子上的盘子是a[1],a[2],…,a[n]. a[1]n,a[2]n-1,…,a[n]1.即a[1]是最下面的盘子&#xff0e;…

[JavaWeb-XML]XML基本语法与快速入门

语法&#xff1a; * 基本语法&#xff1a;1. xml文档的后缀名 .xml2. xml第一行必须定义为文档声明3. xml文档中有且仅有一个根标签4. 属性值必须使用引号(单双都可)引起来5. 标签必须正确关闭6. xml标签名称区分大小写示例代码如下: <?xml version1.0 ?><users>…

Beetlex.Redis之Stream功能详解

有一段时间没有写文章&#xff0c;techempower的测试规则评分竟然发生了变化&#xff0c;只能忘着补充一下占比权重最多的数据更新示例了和深入设计一下组件模块化加载的设计。但在不久前有用户问了一下组件是否支持redis的Stream功能&#xff0c;看了一样相关资料后把功能实现…

一文说通Dotnet Core的后台任务

这是一文说通系列的第二篇&#xff0c;里面有些内容会用到第一篇中间件的部分概念。如果需要&#xff0c;可以参看第一篇&#xff1a;一文说通Dotnet Core的中间件一、前言后台任务在一些特殊的应用场合&#xff0c;有相当的需求。比方&#xff0c;我们需要实现一个定时任务、或…

[JavaWeb-XML]XML组成部分

组成部分&#xff1a; 1. 文档声明1. 格式&#xff1a;<?xml 属性列表 ?>2. 属性列表&#xff1a;* version&#xff1a;版本号&#xff0c;必须的属性* encoding&#xff1a;编码方式。告知解析引擎当前文档使用的字符集&#xff0c;默认值&#xff1a;ISO-8859-1* st…

2021年度训练联盟热身训练赛第五场 H题In-place Sorting+贪心构造

题意&#xff1a; 给你n个小于101810^{18}1018的大数&#xff0c;问在可以再不改变序列位置&#xff0c;之改变数值中某数位的‘9’变为‘6’或将‘6’变为‘9’&#xff0c;求的最终序列由小到大&#xff0c;且字典序最小。 题目&#xff1a; 链接&#xff1a;https://ac.n…

用.NET进行客户端Web开发?看这个Bootstrap风格的BlazorUI组件库

点击上方“Dotnet9”添加关注哦Blazor一、前言今天在下班的路上&#xff08;地铁上&#xff09;&#xff0c;站长习惯性的掏出手机&#xff0c;就收到知乎向站长推送的一篇BlazorUI组件库推荐文章&#xff0c;是码云官方的&#xff1a;原文链接[1]&#xff0c;于是我立即打开码…

2021年度训练联盟热身训练赛第五场F题Group Project

题意&#xff1a; 有n个人&#xff0c;其中有m组&#xff0c;两两互斥&#xff0c;现在要分成两个班&#xff0c;但最终求的确是最多有多少对不互斥的。 题目&#xff1a; 链接&#xff1a;https://ac.nowcoder.com/acm/contest/16741/F 来源&#xff1a;牛客网 The big day…

[JavaWeb-XML]XML约束概述

约束&#xff1a;规定xml文档的书写规则 * 作为框架的使用者(程序员)&#xff1a;1. 能够在xml中引入约束文档2. 能够简单的读懂约束文档* 分类&#xff1a;1. DTD:一种简单的约束技术2. Schema:一种复杂的约束技术

在Asp.NET Core中如何优雅的管理用户机密数据

在Asp.NET Core中如何优雅的管理用户机密数据背景回顾在软件开发过程中&#xff0c;使用配置文件来管理某些对应用程序运行中需要使用的参数是常见的作法。在早期VB/VB.NET时代&#xff0c;经常使用.ini文件来进行配置管理&#xff1b;而在.NET FX开发中&#xff0c;我们则倾向…

食物链 POJ - 1182

题目&#xff1a; 动物王国中有三类动物A,B,C&#xff0c;这三类动物的食物链构成了有趣的环形。A吃B&#xff0c; B吃C&#xff0c;C吃A。 现有N个动物&#xff0c;以1&#xff0d;N编号。每个动物都是A,B,C中的一种&#xff0c;但是我们并不知道它到底是哪一种。 有人用两种…

[XML-Jsoup]Jsoup_解析_快速入门

xml常见的解析器&#xff1a; 1. JAXP&#xff1a;sun公司提供的解析器&#xff0c;支持dom和sax两种思想2. DOM4J&#xff1a;一款非常优秀的解析器3. Jsoup&#xff1a;jsoup 是一款Java 的HTML解析器&#xff0c;可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力…

基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(三)

系列文章使用 abp cli 搭建项目给项目瘦身&#xff0c;让它跑起来完善与美化&#xff0c;Swagger登场数据访问和代码优先自定义仓储之增删改查统一规范API&#xff0c;包装返回模型再说Swagger&#xff0c;分组、描述、小绿锁接入GitHub&#xff0c;用JWT保护你的API异常处理和…

计蒜客 逃生+动态规划

题目&#xff1a; 蒜头君在玩一款逃生的游戏。在一个 nmn \times mnm 的矩形地图上&#xff0c;蒜头位于其中一个点。地图上每个格子有加血的药剂&#xff0c;和掉血的火焰&#xff0c;药剂的药效不同&#xff0c;火焰的大小也不同&#xff0c;每个格子上有一个数字&#xff0…

[XML-Jsoup]Jsoup_对象的使用(Jsoup工具类,Document,Elements,Element,Node)

对象的使用&#xff1a; 1. Jsoup&#xff1a;工具类&#xff0c;可以解析html或xml文档&#xff0c;返回Document* parse&#xff1a;解析html或xml文档&#xff0c;返回Document* parse​(File in, String charsetName)&#xff1a;解析xml或html文件的。* parse​(String ht…

别了,Docker Swarm !你好,K8s !

毫无疑问&#xff0c;Kubernetes已经成为容器编排事实标准。除了已经拥抱Kubernetes的Google、BAT、京东、奇虎360等巨头大厂外&#xff0c;更多的企业也都在向Kubernetes迁移。容器技术大势所趋&#xff0c;是互联网企业目前急需的技术人才之一&#xff0c;已成为运维工程师、…