大数阶乘的常规运算

即数学的模拟运算。一位一位的乘,有进位就进位。

#include <bits/stdc++.h>
#define _xx ios_base::sync_with_stdio(0);cin.tie(0);
using namespace std;
typedef long long LL;
//1,2,6,24,120,720,5040,40320,362880,3628800,
int a[40000];
int main()
{int n;while(cin>>n){memset(a,0,sizeof(a));a[1]=1;int i,j,len=1,rest;for(i=2;i<=n;i++){rest=0;for(j=1;j<=len;j++){a[j]=a[j]*i+rest;rest=a[j]/10;a[j]=a[j]%10;}while(rest){a[j++]=rest%10;rest/=10;}len=j-1;}for(i=len;i>=1;i--) cout<<a[i];cout<<endl;}
}

引例之速求阶乘末尾0的个数

我们知道末尾0至于阶乘中的因子2*5有关,并且阶乘n中5的数量比2的数量少很多。
如果我们要考虑阶乘尾数0的个数,就只要知道有多少个2*5即可,只要知道5的个数即可。
所以我们只要算出N!中5的个数。
而N!中5的个数公式=n/5+n/25+n/125…n/(5^m)
举个例子。n=1000。
1-1000中5有a1=200。
1-1000有25有a2=40。
1-1000有125有a3=8。
1-1000有625有a4=1。
所以5的个数有5+25+125+625。为什么直接加?因为如1-1000中的数75,它有2个5。他在a1中算过一次,在a2中也算过一次。
so。实现代码如下。

#include <bits/stdc++.h>
using namespace std;
//n![1~10]:1,2,6,24,120,720,5040,40320,362880,3628800,
int main()
{int n;cin>>n;int ans=0;while(n){ans+=n/5;n/=5;}cout<<ans<<endl;return 0;
}

大数阶乘要取模,快速取模

试用情况:当数很大,普通的阶乘取模很慢,需要用快速阶乘取模的算法。
具体算法是这样。
由10!
=1*2*3*4*5*6*7*8*9*10
=1*2*3*(2*2)5(2*3)7(2*2*2)(3*3)(2*5)
=1*(2^8)(3^4)(5^2)*7
我们可以想到,如果把每个数的质因数都分解出来,并且统计每种质因子有多少个,我们就可以多次使用二分求幂,再把它们的结果乘起来。注意这里并不是真的要老老实实地去分解每个数的质因子。对于每个质数x,我们可以很快算出前n个正整数一共包含有多少个质因子x(参考求n!末尾有多少个0么)。

#include <bits/stdc++.h>
#define _xx ios_base::sync_with_stdio(0);cin.tie(0);
using namespace std;
typedef long long LL;
//n![1~10]:1,2,6,24,120,720,5040,40320,362880,3628800,
const int mod=1000000007;
int prime[2000];
bool vis[10005];
int cnt=0;
void init()
{int m=sqrt(10005);for(int i=2;i<=m;i++){if(!vis[i]){for(int j=i*2;j<=10005;j+=i){vis[j]=true;}}}for(int i=2;i<=10000;i++) if(!vis[i])prime[cnt++]=i;
}
LL poww(LL a,LL b,LL m)
{LL ans=1;while(b){if(b&1) ans=ans*a%m;a=a*a%m;b>>=1;}return ans;
}
int main()
{_xx;init();int n;while(cin>>n){LL ans=1;for(int i=0;i<cnt && prime[i]<=n;i++){int k=0;int t=n;while(t){k+=t/prime[i];t/=prime[i];}ans=ans*poww(prime[i],k,mod)%mod;}cout<<ans<<endl;}
}

阶乘计算之大数阶乘与快速取模阶乘计算相关推荐

  1. 牛客网j题(快速幂取模阶乘处理贝塔函数费马定理)

    传送门 求(贝塔函数运用) Γ(x)=∫01(x−x2)ndx=(n!)2/(2n+1)!\Gamma(x) = \int_0 ^1\ (x-x^2)^{n}dx=(n!)^2/(2n+1) !Γ(x ...

  2. 逐位相加法-快速取模算法

    任意两个整数 A B 做乘法 C = A×B 然后把 A,B, C的十进制每个数分别相加,如果和大于10就继续把每个数相加,直到只剩一位数,分别得到 A1 B1 C1 D = A1 × B1,对D也进 ...

  3. 不同符号的两个整数求余和取模的计算技巧(规律)

    文章目录 求余函数和取模函数的区别 x 和 y 符号不同,求余数和模数的技巧 求余的运算规律(技巧) 取模的运算规律(技巧) 求余函数和取模函数的区别 求余函数rem(x,y) 和取模函数 mod(x ...

  4. java 幂取模_计算一个数与2的n次方取模

    HashMap的数据是存储在链表数组里面的.在对HashMap进行插入/删除等操作时,都需要根据K-V对的键值定位到他应该保存在数组的哪个下标中. 而这个通过键值求取下标的操作就叫做哈希. HashM ...

  5. 斯特灵公式求阶乘c语言,斯特林公式 ——Stirling公式(取N阶乘近似值)

    基于UDP协议的socket编程示例 客户端 import java.io.IOException; import java.net.DatagramPacket; import java.net.D ...

  6. 轻松搞定PMP考试的计算题(二)快速弄懂折旧计算

    在PMP考试当中,也有部分的计算题,这让不少同学非常苦恼,其实只要掌握其中的公式,再做一些习题,计算题也是可以轻松应对的. 从今天起,本周一连五天,将给大家讲解计算方面的内容,讲解将从必考计算公式.折 ...

  7. 大数取模运算,快速幂取模运算

    1.快速幂取模 http://www.cnblogs.com/yinger/archive/2011/06/08/2075043.html 快速幂取模就是在O(logn)内求出a^n mod b的值. ...

  8. 【PTA】7-2 国王的奖励——分数取模、分治思想、快速幂、int64的乘法模运算【C/C++】

    文章目录 1 问题 1.1 题面描述 1.2 输入描述 1.3 输出描述 1.4 样例描述 1.5 样例解释 2 分析 2.1 数学抽象 2.2 解决方法 2.2.1 等比求和 2.2.1.1 求和公 ...

  9. c语言中如何区分取模和除法,除法、求余和取模的区别

    一.除法运算符"/" 二元运算符,具有左结合性.参与运算的量均为 整型时,结果为整型,舍去小数.如果运算量中有一个为实型,结果为双精度实型.例如: 5/2=2,1/2=0 5/2. ...

最新文章

  1. php 不等待返回的实现方法(异步调用)
  2. 架构漫谈读后感之软件架构师如何工作
  3. MySQL自定义函数(CREATE FUNCTION)
  4. ZOJ 3735 Josephina and RPG
  5. Bubble——Typecho 极简风格响应式主题
  6. Access在Win10连接失败的问题
  7. 单选按钮、复选按钮的简单应用
  8. 数据库设计工具-----PD
  9. 京东联盟api集成的坑
  10. 网络口碑理论的精髓:AISAS
  11. WOS(五)——字段标识
  12. 企业WiFi管理 保卫我们的信息安全
  13. 2021-08-23 FM24C04写入数据时,跨页会导致指针指向本页的起始地址
  14. 城市轨道交通联锁试验方法介绍
  15. 玩回合制手游《问道》心得
  16. 你不知道的 async、await 魔鬼细节
  17. lucene tvx tvd tvf 文件
  18. 湖南师范大学2018年大学生程序设计竞赛新生赛 J 名哥的完全平方数 莫队算法
  19. 后向投影算法(BPA)-SAR成像算法系列(二)
  20. 爬虫豆瓣TOP250电影数据

热门文章

  1. 迅软手动解密文件夹,有几个文件解密报错解决方法
  2. 大一计算机ppt4.3实训内容,沪科教版信息技术七年级下册4.3《图文混排》PPT课件4.ppt...
  3. 为什么你夸奖得越多,别人觉得越虚伪
  4. IPTV、数字电视和网络电视三者的区别与联系
  5. k8s二进制集群部署安装文档
  6. 开发android主攻四大方向
  7. 软件测试工程师是做什么的?待遇前景怎么样?
  8. 渗透技巧——获得Powershell命令的历史记录
  9. 字节测试开发最牛教程,全栈Jmeter_性能测试(总结)
  10. Html css是前端吗,HTML5 CSS3 Web前端开发