2道阶乘的算法题

冲着51nod新UI去做了题,顺便总结一下,这里有2道阶乘的题,

1003 阶乘后面0的数量

n的阶乘后面有多少个0?

6的阶乘 = 1*2*3*4*5*6 = 720,720后面有1个0。

Input

一个数N(1 <= N <= 10^9)

OutPut

输出0的数量

Input示例

5

Output示例

1

看到这题第一反应就是,这该不会是有规律的把?

好吧,确实,问题就是,末尾的0是怎么构成的,仔细想一下,还是能想出来,是5和其他偶数相乘得到的,这样下去,是不是只要因子5的个数就好了?确实,因为从1~N的阶乘中,凡是遇到5的倍数的,之前都有偶数,如下:

1, 2, 3, 4, 5, 6, 7, 8, 9, 10 .....5n-1, 5n....N

5之前有偶数2和4,10之前有偶数6和8,这样,每个5n之前都有偶数能够跟它构成阶乘末尾的一个0,把这些5n抽出来,可以得到 5^k * k! (k = N/5) ,这样,可以先得到k个5,然后再递归求k!中5的个数,就可以求出因子5的个数了,好了,上代码:

#include <iostream>
using namespace std;

int main(){
    int a, ans = 0;
    cin >> a;
    while(a){
        a /= 5;
        ans += a;
    }
    cout << ans;
    return 0;
}

之前写了个递归,这样就能AC了。

1008 N的阶乘 mod P

输入N和P(P为质数),求N! Mod P = ? (Mod 就是求模 %)

例如:n = 10, P = 11,10! = 3628800

3628800 % 11 = 10

Input

两个数N,P,中间用空格隔开。(N < 10000, P < 10^9)

OutPut

输出N! mod P的结果。

Input示例

10 11

Output示例

10

一看到这题,就在想阶乘能否算出来,要是N等于9999的话,N!是非常大的,会溢出,用大数来模拟也很麻烦,醉了,好吧,上网搜了一下,取模运算是有规律的,其中,有一条规律是这样的,

(a * b) % p = (a % p * b % p) % p

我想,这规律怎么小学的时候没看到。。。

好吧,通过这个规律,可以推出:

N! % P = ((N-1)!  % P) * N % P

也就是说,在求N-1的阶乘的时候,可以求模,然后保存余数,下一轮就可以用余数来乘以N,然后求模,就求出N的阶乘模P的结果了,代码如下:

#include <iostream>
using namespace std;

int main(){
    long long N, P, ans = 1;
    cin >> N >> P;
    for(long long i = 2; i <= N; i++){
        ans = (ans * i) % P;
        if(ans == 0) break;
    }
    cout << ans;
    return 0;
}

这里如果用int的话,是不能通过的。

时间: 2024-10-09 23:11:21

2道阶乘的算法题的相关文章

10道java经典算法题,每一题都能提升你的java水平!第二弹!

10道java经典算法! 持续更新java小知识,跪求关注,祝关注我的人都:身体健康,财源广进,福如东海,寿比南山,早生贵子,从不掉发! [程序1] 题目:有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 1.程序分析:可填在百位.十位.个位的数字都是1.2.3.4.组成所有的排列后再去   掉不满足条件的排列. public class Wanshu { public static void main(String[] args) { int i=0; int j=

25道经典Java算法题

即使做web开发,也会遇到各种各种需要解决的算法问题,本文节选部分经典练手算法,并提供相关参考答案,希望对你有所帮助[程序1]题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少? //这是一个菲波拉契数列问题 public class test01 { public static void main(String[] args) { int f1=1,f2=1,f; int M=30; System.

一天一道算法题---6.11---大数阶乘

感谢微信平台----一天一道算法题----每天多一点进步 大数的概念 感觉是我接触acm 1 2 个月之后才有的....64位的Long long 和 __int64 也大概都是那时候才有的.. 大数 相加 相乘 相除 求余  相减不知道 有没有... 都是应该要掌握的.. 可能 我也会陆续把上面的全慢慢贴上来 // 呆会就直接把 微信提供的代码给贴上来了  先要去次午饭了 早饭 午饭永远是连一起的 .......... // 刚刚碰到个最小生成树的题 第一次用了邻接表去做 蛮cool == 一

[2]十道算法题【Java实现】

前言 清明不小心就拖了两天没更了-- 这是十道算法题的第二篇了-上一篇回顾:十道简单算法题 最近在回顾以前使用C写过的数据结构和算法的东西,发现自己的算法和数据结构是真的薄弱,现在用Java改写一下,重温一下. 只能说慢慢积累吧-下面的题目难度都是简单的,算法的大佬可直接忽略这篇文章了-入门或者算法薄弱的同学可参考一下- 很多与排序相关的小算法(合并数组.获取数字每位值的和),我都没有写下来了,因为只要会了归并排序(合并数组),会了桶排序(获取数字每位的值),这些都不成问题了.如果还不太熟悉八大

【软帝学院】12道java经典入门算法题!

12道java经典入门算法题! [程序1]   题目:将一个数组逆序输出. 程序分析:用第一个与最后一个交换. 其实,用循环控制变量更简单: for(int k=11;k>=1;k--) System.out.print(myarr[k]+","); [程序2]   题目:取一个整数a从右端开始的4-7位. 程序分析:可以这样考虑: (1)先使a右移4位. (2)设置一个低4位全为1,其余全为0的数.可用~(~0 < <4) (3)将上面二者进行&运算. pu

12道java经典入门算法题!

12道java经典入门算法题![程序1] ? 题目:将一个数组逆序输出. ? 程序分析:用第一个与最后一个交换. ? 其实,用循环控制变量更简单:for(int k=11;k>=1;k--)System.out.print(myarr[k]+","); [程序2] ? 题目:取一个整数a从右端开始的4-7位. ? 程序分析:可以这样考虑: ? (1)先使a右移4位. ? (2)设置一个低4位全为1,其余全为0的数.可用~(~0 < <4) ? (3)将上面二者进行&a

牛逼!一行代码居然能解决这么多曾经困扰我半天的算法题

春节假期这么长,干啥最好?当然是折腾一些算法题了,下面给大家讲几道一行代码就能解决的算法题,当然,我相信这些算法题你都做过,不过就算做过,也是可以看一看滴,毕竟,你当初大概率不是一行代码解决的. 学会了一行代码解决,以后遇到面试官问起的话,就可以装逼了. 一.2 的幂次方 问题描述:判断一个整数 n 是否为 2 的幂次方 对于这道题,常规操作是不断这把这个数除以 2,然后判断是否有余数,直到 n 被整除成 1 . 我们可以把 n 拆成二进制看待处理的,如果 n 是 2 的幂次方的话,那么 n 的

ios 算法题

1兔子算法题 兔子可以跳一步2步或者3步,问跳到100有多少种跳法? // 兔子可以跳一步2步或者3步 // 问跳到100有几种跳法 /* 分析1 两个变量,X*2+Y*3=100. X最大为50,X最小为2 Y最大为32.最小为0 分析2 某个情景分析:假设X=35,Y为10时, 虽然知道了数量,但是兔子的35小步,和10大步的顺序是怎样的? 应为组合-> 45个节点中,选择10个放三步的.那就是简单的C(45 10).变成阶乘,就解得出来. */ double temp=0.0f; for

[solution]腾讯TEG_计算广告组_算法题

度娘笔试归来,题目实打实的,感觉真心不易,上百号人就抢那么几个坑......只恨自己平时积累太少啊~ 故曝一道鹅厂面试用的算法题(当时我就死在了这题上),来为度娘家攒一下RP~ 题目: 对于长度为N的一个无序的数组a[1..N],请将a进行排序,要求所有正数都排在0之前,所有负数都排在0之后(如果没有0,则所有正数排在负数前) 要求时间复杂度O(N),空间复杂度O(1) 题目不难,但给思考的时间很短,大约不到5分钟吧.当时脑子比较短路,于是只给出了O(n) O(n)复杂度的算法,然后就被面试官挂