【USACO 3.2.1】阶乘
【描述】
N的阶乘写作N!表示小于等于N的所有正整数的乘积。阶乘会很快的变大,如13!就必须用32位整数类型来存储,70!即使用浮点数也存不下了。你的任务是找到阶乘最后面的非零位。举个例子,5!=1*2*3*4*5=120所以5!的最后面的非零位是2,7!=1*2*3*4*5*6*7=5040,所以最后面的非零位是4。
【格式】
共一行,一个整数不大于4,220的整数N。
共一行,输出N!最后面的非零位。
【分析】
先打素数表,然后分解质因数,再去掉可以产生末尾0的2和5(不是所有二和五,而是他们的最小值),最后在把剩下的乘起来MOD10。
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
const int maxn=;
using namespace std;
int cnt[maxn],vis[maxn];
int prime[maxn];
void built_prime();//打表
void check(int n);
int pow_mod(int num,int t);
int main()
{
int n,i,temp,ans=;
//文件操作
freopen("fact4.in","r",stdin);
freopen("fact4.out","w",stdout);
built_prime();
//printf("1");
scanf("%d",&n);
for (i=;i<=n;i++) check(i);//分解质因数
temp=min(cnt[],cnt[]);
cnt[]-=temp;cnt[]-=temp;
for (i=;i<=prime[];i++)
{
if (cnt[prime[i]]!=)
ans=(ans*pow_mod(prime[i],cnt[prime[i]]))%;//快速幂取模
}
printf("%d",ans%);
return ;
}
int pow_mod(int num,int t)
{
if (t==) return num%;
if (t==) return (num*num)%;
int temp=pow_mod(num,t/);
if (t%==) return (temp*temp)%;
else return (temp*temp*num)%;
}
void built_prime()
{
int i,j;
memset(cnt,,sizeof(cnt));
prime[]=;
for (i=;i<=maxn;i++)
{
if (vis[i]==)
{
prime[++prime[]]=i;
for (j=i;j<=maxn;j+=i) vis[j]=;
}
}
}
void check(int n)
{
int i;
while (n!=)
{
for (i=;i<=prime[];i++)
if (n%prime[i]==) {cnt[prime[i]]++;n=n/prime[i];break;}
}
}
【USACO 3.2.1】阶乘的更多相关文章
- [SinGuLaRiTy] 数论题目复习
[SinGuLaRiTy-1020] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved. [CQBZOJ 1464] Hankson 题目描述 H ...
- 洛谷 P2726 阶乘 Factorials Label:Water
题目背景 N的阶乘写作N!,表示小于等于N的所有正整数的乘积. 题目描述 阶乘会变大得很快,如13!就必须用32位整数类型来存储,到了70!即使用浮点数也存不下了. 你的任务是找到阶乘最前面的非零位. ...
- 洛谷P2726 阶乘 Factorials
题目背景 N的阶乘写作N!,表示小于等于N的所有正整数的乘积. 题目描述 阶乘会变大得很快,如13!就必须用32位整数类型来存储,到了70!即使用浮点数也存不下了. 你的任务是找到阶乘最前面的非零位. ...
- (Step1-500题)UVaOJ+算法竞赛入门经典+挑战编程+USACO
http://www.cnblogs.com/sxiszero/p/3618737.html 下面给出的题目共计560道,去掉重复的也有近500题,作为ACMer Training Step1,用1年 ...
- 算法竞赛入门经典+挑战编程+USACO
下面给出的题目共计560道,去掉重复的也有近500题,作为ACMer Training Step1,用1年到1年半年时间完成.打牢基础,厚积薄发. 一.UVaOJ http://uva.onlinej ...
- 洛谷题解 P1134 【阶乘问题】
原题传送门 题目描述 也许你早就知道阶乘的含义,N阶乘是由1到N相乘而产生,如: 12!=1×2×3×4×5×6×7×8×9×10×11×12=479,001,600 12的阶乘最右边的非零位为6. ...
- C语言 · 阶乘计算 · 基础练习
问题描述 输入一个正整数n,输出n!的值. 其中n!=1*2*3*-*n. 算法描述 n!可能很大,而计算机能表示的整数范围有限,需要使用高精度计算的方法.使用一个数组A来表示一个大整数a,A[0]表 ...
- Java 计算N阶乘末尾0的个数-LeetCode 172 Factorial Trailing Zeroes
题目 Given an integer n, return the number of trailing zeroes in n!. Note: Your solution should be in ...
- 关于for循环的几个小练习,例如奇数偶数,阶乘,求和等
1 .100以内的奇数和偶数 var js = ""; var os = ""; for(var i=1;i<101;i++) { if(i%2 == 0 ...
随机推荐
- WordPress Duplicator 0.4.4 Cross Site Scripting
测试方法: 提供程序(方法)可能带有攻击性,仅供安全研究与教学之用,风险自负! Advisory ID: HTB23162 Product:DuplicatorWordPressPlugin Vend ...
- sed的选项与命令简要
第一部分:sed命令选项 sed选项 说明 -n, --quiet, --silent 静默模式,取消将模式空间中的内容自动打印出来. -e script, --expression=script 以 ...
- 使用vs2010编译 Python \ SIP \ PyQt4
(1)先使用vs2010编译 Python http://www.cnblogs.com/fortwo/archive/2013/04/16/3023871.html 注意,若编译的为debug版的P ...
- poj2299
好吧,看到这个图片就知道是干什么的了,求逆序数- - 可以用线段树,貌似还可以用归并排序,这题应该是考的归并排序,毕竟是递归分治- - 基本上都忘了,再写一写试试吧. AC ///////////// ...
- linux —— 学习笔记(软件操作:安装、卸载、执行)
目录: 0.相关基本命令 1.安装软件 2.卸载软件 3.打开软件 0.相关基本命令 与软件操作相关的主要命令有:dpkg 和 apt-get . dpkg : “dpkg ...
- OpengGL ES2.0 Using NDK
使用C语言在Android Studio中编写OpenGL ES,首要的任务就是配置编程环境. 在最新的Android Studio中,可以直接编译C/C++源代码.本人的版本是Android Stu ...
- iOS开发之监测网络状态
一.说明 在网络应用中,需要对用户设备的网络状态进行实时监控,有两个目的: (1)让用户了解自己的网络状态,防止一些误会(比如怪应用无能) (2)根据用户的网络状态进行智能处理,节省用户流量,提高用户 ...
- Android项目实战--手机卫士20--拿到已经安装了的程序以及程序管理主界面
好了,之前我们就讲了高级工具里面的短信备份与还原,那么我们高级工具里面的功能就基本上完成的啦,还有一个叫程序锁的功能而已,但我们今天先不做它先,我们先把我们的程序管理这个功能完成先. 先让大家看一下我 ...
- [资源分享]神州数码 思科 UCS 虚拟化培训资料
神州数码 思科 UCS 虚拟化培训资料 点击文件名下载 UCS统一计算平台=.pdf 云计算Demo实验教材_Nexus 5K2K实验.pdf 云计算数据中心架构与技术.pdf 云计算数据中心虚拟 ...
- MySQL如何有效地创建基于 INNODB 引擎的表
2016-05-27 赵伟 数据库开发者 有用户问我们为什么下面这个建表语句会执行失败,报错是 "Row size too large ...."下面我就以这个例子出发讲一讲使用m ...