Factorials
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的更多相关文章
- HackerRank Extra long factorials
传送门 今天在HackerRank上翻到一道高精度题,于是乎就写了个高精度的模板,说是模板其实就只有乘法而已. Extra long factorials Authored by vatsalchan ...
- 每日一九度之 题目1038:Sum of Factorials
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2109 解决:901 题目描述: John von Neumann, b. Dec. 28, 1903, d. Feb. 8, 1957, ...
- POJ 1775 (ZOJ 2358) Sum of Factorials
Description John von Neumann, b. Dec. 28, 1903, d. Feb. 8, 1957, was a Hungarian-American mathematic ...
- (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 ...
- USACO 3.2 Factorials
Factorials The factorial of an integer N, written N!, is the product of all the integers from 1 thro ...
- 【CodeChef】Small factorials(BigInteger笔记)
You are asked to calculate factorials of some small positive integers. Input An integer t, 1<=t&l ...
- 九度OJ 1038:Sum of Factorials(阶乘的和) (DP、递归)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1845 解决:780 题目描述: John von Neumann, b. Dec. 28, 1903, d. Feb. 8, 1957, ...
- SPOJ:Easy Factorials(占位)
Finding factorials are easy but they become large quickly that is why Lucky hate factorials. Today h ...
- LightOJ - 1189 - Sum of Factorials
先上题目 Sum of Factorials Time Limit:500MS Memory Limit:32768KB 64bit IO Format:%lld & %llu ...
随机推荐
- JSP标签c:forEach报错(二)
1.今天,我在用c标签写一些样例,结果出现一些错误,写下作为记录 具体错误如下: 三月 31, 2014 9:46:28 下午 org.apache.catalina.core.StandardWra ...
- Caused by: java.lang.ClassNotFoundException: Could not load requested class : org.h2.Driver
1.错误描述 WARN:2015-05-01 13:26:10[localhost-startStop-1] - HHH000402: Using Hibernate built-in connect ...
- Jqurey 得到url参数 getUrlParam
Jqurey 得到url参数 getUrlParam <script type="text/javascript"> (function ($) { //扩展方法获取u ...
- Jquery常用操作:checkbox、select取值,radio、checkbox、select选中及其相关
常用Jquery操作:checkbox取值.select取值.radio选中.checkbox选中.select选中及其相关: 1.影藏页面元素 使用jquery真的很方便,比如要控制div的显示与隐 ...
- 常用javascript表单验证方法
//座机电话验证(支持分机) function chekeTel(tel) { var Tel = /^\d{3,4}-\d{7,8}(-\d{3,4})?$/; if (Tel.test(tel)) ...
- CF198 div1 D - Iahub and Xors
简单说就是左边x,y按照奇偶分为四种对于答案的影响都是不相关的 #include<bits/stdc++.h> using namespace std; typedef long long ...
- 【BZOJ2434】阿狸的打字机(AC自动机,树状数组)
[BZOJ2434]阿狸的打字机(AC自动机,树状数组) 先写个暴力: 每次打印出字符串后,就插入到\(Trie\)树中 搞完后直接搭\(AC\)自动机 看一看匹配是怎么样的: 每次沿着\(AC\)自 ...
- 【BZOJ4012】开店(主席树)
[BZOJ4012]开店(主席树) 题面 Description 风见幽香有一个好朋友叫八云紫,她们经常一起看星星看月亮从诗词歌赋谈到 人生哲学.最近她们灵机一动,打算在幻想乡开一家小店来做生意赚点钱 ...
- python 想搞加密算法吗?快戳这里
加密算法介绍 一,HASH Hash,一般翻译做"散列",也有直接音译为"哈希"的,就是把任意长度的输入(又叫做预映射,pre-image),通过散列算法,变换 ...
- java接口----继承(实现)方法
文中"实现"一词特指接口的继承. 一个类实现多个接口时,不能出现同名的默认方法. 一个类既要实现接口又要继承抽象类,先继承后实现. 一个抽象类可以继承多个接口(implements ...