Factorials 阶乘

    题目大意:给你一个数n,求出n ! 的最后一个非零位。

    注释:n<=4200

      想法:开始的想法是觉得这道题应该比较的有趣,因为我们知道,一个数的阶乘的最后的非零位后面或者是0,或者n<=4,所以,我们思考,如何才能有效的登出这个非零位。首先,我们发现,这个非零位后面零的个数是和n!中5的个数有关的,所以,我们思考:如果我们使得这个阶乘没有5会怎么样。想着想着,我相信你的头脑里会自然地蹦出一个定理——唯一分解定理。为什么?因为只有在这个定理的辅助下你才可以将5全部提取出来。我们又想到:由于唯一分解定理的存在,每个数都是有一个或几个定下来的素数组成,我们只需要这句话的一个性质:素数。一个数由素数组成,显然,这个素数是不大于本数的,n的数据范围是4200,是完全在我们的接受范围之内,想到这,这道题的大体轮廓就分为这样几个步骤:

      1.筛出n之前的所有素数,由于n的数据范围过小,我们可以O ( n ) 的方法去筛。

      2.对于每一个素数,我想求出n!中这个元素最多可以被整除多少次,也就是说我们到底有多少数包含多少这个素数。在此,介绍一个定理$f(n,k)=\sum\limits_{i=1}^{\infty} \lfloor \frac{n}{k^i}\rfloor$其中,f(n,k),表示n!中k的个数。

      3.这么筛,显然不对,4200里面2的个数就够我们受的了,我们想得到一种优化,我们发现,我们其实只需要得到这个素数的最后一位即可。

      4.但,还是有些困难,我们又发现了,对于每一个素数来讲(假设这个素数是a)$a^{4*k+i}=a^i$,我们只需处理%4意义下的即可。但是,a==2是需要特判。

      呼~长出一口气,这题就切了。

    最后,附上丑陋的代码......

 #include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
int x[];
int ans[];
int num(int a,int b)//计算素数在n!中的个数,这个函数表示b在a!中的个数
{
int ans=;
while(a)
{
ans+=a/b;
a/=b;
}
return ans;
}
int power(int a,int b)//快速幂,其实可以直接乘,因为我们只考虑模4意义下
{
a%=;
int ans=;
while(b)
{
if(b&) ans=(ans*a)%;
b>>=;
a=(a*a)%;
}
return ans;
}
bool prime(int a)//判断是否为素数
{
int k=(int)(sqrt(a));
bool flag=true;
for(int i=;i<=k;i++)
{
if(a%i==)
{
flag=false;
break;
}
}
return flag;
}
int main()
{
int n;
int cnt=;
scanf("%d",&n);
for(int i=;i<=n;i++)//筛素数
{
if(prime(i)) x[++cnt]=i;
}
for(int i=;i<=cnt;i++)//用ans[]存素数个数
{
ans[x[i]]+=num(n,x[i]);
}
ans[]-=ans[];//我们再次用等数量的2将5替换掉,以便将最后的零去掉。
ans[]=;
int ansans=;
for(int i=;i<=cnt;i++)//对于每一个素数来讲,我们进行计算
{
ans[x[i]]%=;
if(ans[x[i]]==&&x[i]==)//特判2,因为别的素数的4次方的最后一位都是1(5已经除去),但2不是
{
ansans*=;
ansans%=;
}
ansans*=power(x[i],ans[x[i]]);
ansans%=;//我们只要最后一位
}
printf("%d\n",ansans);
return ;
}

    小结:错误:

      2A,第一次忘记特判2。

Factorials的更多相关文章

  1. HackerRank Extra long factorials

    传送门 今天在HackerRank上翻到一道高精度题,于是乎就写了个高精度的模板,说是模板其实就只有乘法而已. Extra long factorials Authored by vatsalchan ...

  2. 每日一九度之 题目1038:Sum of Factorials

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2109 解决:901 题目描述: John von Neumann, b. Dec. 28, 1903, d. Feb. 8, 1957, ...

  3. POJ 1775 (ZOJ 2358) Sum of Factorials

    Description John von Neumann, b. Dec. 28, 1903, d. Feb. 8, 1957, was a Hungarian-American mathematic ...

  4. (Problem 34)Digit factorials

    145 is a curious number, as 1! + 4! + 5! = 1 + 24 + 120 = 145. Find the sum of all numbers which are ...

  5. USACO 3.2 Factorials

    Factorials The factorial of an integer N, written N!, is the product of all the integers from 1 thro ...

  6. 【CodeChef】Small factorials(BigInteger笔记)

    You are asked to calculate factorials of some small positive integers. Input An integer t, 1<=t&l ...

  7. 九度OJ 1038:Sum of Factorials(阶乘的和) (DP、递归)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1845 解决:780 题目描述: John von Neumann, b. Dec. 28, 1903, d. Feb. 8, 1957, ...

  8. SPOJ:Easy Factorials(占位)

    Finding factorials are easy but they become large quickly that is why Lucky hate factorials. Today h ...

  9. LightOJ - 1189 - Sum of Factorials

    先上题目 Sum of Factorials Time Limit:500MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu ...

随机推荐

  1. Windows 7 Visual Studio 2008配置OpenGL开发环境

    Windows 7 Visual Studio 2008配置OpenGL开发环境 glut下载地址: http://www.opengl.org/resources/libraries/glut/gl ...

  2. 基于am3358的lcd输出

    /*#include<stdio.h> */ #include <unistd.h> #include <stdio.h> #include <stdlib. ...

  3. My97 DatePicker图标触发

    My97 DatePicker图标触发 1.设计源码 <%@ page language="java" import="java.util.*" page ...

  4. freemarker自定义标签(二)

    freemarker自定义标签 1.自定义标签 通过自定义标签,写一个重复指定字符串 2.实现源码 <html> <head> <meta http-equiv=&quo ...

  5. C# 中?和??的用法

    最近在看官方的源码时,经常看到有 Int? sum; 和 FileProvider = FileProvider ??builder.GetFileProvider(); 一个问号: 很多数据类型时不 ...

  6. JavaScript设计模式(9)-享元模式

    享元模式 1. 介绍 一种优化模式 适合解决因创建大量类似对象而累积性能问题 javaScript 代码可能很快就用光浏览器的内容,通过把大量独立对象转化为少量共享对象,可以降低运行 Web 应用所需 ...

  7. Xampp apache与mySQL开不了 解决办法

    Xampp安装后,打开Xampp control panel. 点击Apache对应的Start,开不了.原因是系统的服务占用了80端口,所以要么结束系统服务,要么修改apache端口. 个人比较喜欢 ...

  8. 关于hibernate中hql语句 case when的写法

    java hql case when的用法 if(null == sorter){ hql.append(" order by m.mDate desc,case when m.mealTi ...

  9. SAPUI5 freestyle vs SAP Fiori Elements —— 两种开发SAP UI5 Apps的方式对比

    概述 目前SAPUI5 SDK 提供了两种方式来开发一个SAPUI5 App.一种方式是传统的SAPUI5开发方式,一种是利用SAP Fiori Elements通过模板快速构建应用的方式. 本文简单 ...

  10. 《阿里巴巴Android编码规范》阅读纪要(二)

    版权声明:本文出自汪磊的博客,转载请务必注明出处. 本篇继续上一篇<阿里巴巴Android编码规范>阅读纪要(一) ,还是建议各位同学有时间完整阅读一下<阿里巴巴Android编码规 ...