已知数组a[]及其和sum, 求sum! / (a1!a2!...an!) 的个位数的值。

求某数的逆元表写成了求某数阶乘的逆元表,故一直没找到错误。

P 是质数的幂
B 表示质数,P 表示模数,cal(n) 将返回 n!,以 a × B^b 形式表示,a为模P的情况下。

  1. ll n,x,y,P,B,s[];
  2. ll exgcd(ll a,ll b){
  3. if(!b)return x=,y=,a;
  4. ll d=exgcd(b,a%b),t=x;
  5. return x=y,y=t-a/b*y,d;
  6. }
  7. ll rev(ll a,ll P){exgcd(a,P);while(x<)x+=P;return x%P;}
  8. ll pow(ll a,ll b,ll P){ll t=;for(;b;b>>=1LL,a=a*a%P)if(b&1LL)t=t*a%P;return t;}
  9. struct Num{
  10. ll a,b;
  11. Num(ll a = , ll b = ): a(a), b(b){}
  12. Num operator*(Num x){return Num(a*x.a%P, b+x.b);}
  13. Num operator/(Num x){return Num(a*rev(x.a,P)%P, b-x.b);}
  14. };
  15. Num cal(ll n){return n? Num(s[n%P]*pow(s[P],n/P,P)%P,n/B)*cal(n/B): Num();}
  16. void pre(){
  17. for(int i = s[] = ; i < P; i++)
  18. if(i%B) s[i]=s[i-]*i%P;
  19. else s[i] = s[i-];
  20. s[P] = s[P-];
  21. }
  22. int main(){
  23. B = , P = , pre();
  24. cal(n);
  25. }

hihocoder1639 别人的题解

自己的题解如下:

  1. #include <bits/stdc++.h>
  2.  
  3. #define ll long long
  4. #define ull unsigned long long
  5. #define st first
  6. #define nd second
  7. #define pii pair<int, int>
  8. #define pil pair<int, ll>
  9. #define pli pair<ll, int>
  10. #define pll pair<ll, ll>
  11. #define tiii tuple<int, int, int>
  12. #define pw(x) ((1LL)<<(x))
  13. #define lson l, m, rt<<1
  14. #define rson m+1, r, rt<<1|1
  15. #define sqr(x) ((x)*(x))
  16. #define SIZE(A) ((int)(A.size()))
  17. #define LENGTH(A) ((int)(A.length()))
  18. #define FIN freopen("A.in","r",stdin);
  19. #define FOUT freopen("A.out","w",stdout);
  20. using namespace std;
  21. /***********/
  22. template<typename T>
  23. bool scan (T &ret) {
  24. char c;
  25. int sgn;
  26. if (c = getchar(), c == EOF) return ; //EOF
  27. while (c != '-' && (c < '' || c > '') ) c = getchar();
  28. sgn = (c == '-') ? - : ;
  29. ret = (c == '-') ? : (c - '');
  30. while (c = getchar(), c >= '' && c <= '') ret = ret * + (c - '');
  31. ret *= sgn;
  32. return ;
  33. }
  34. template<typename N,typename PN>inline N flo(N a,PN b){return a>=?a/b:-((-a-)/b)-;}
  35. template<typename N,typename PN>inline N cei(N a,PN b){return a>?(a-)/b+:-(-a/b);}
  36. template<typename T>inline int sgn(T a) {return a>?:(a<?-:);}
  37. template<class T> int countbit(const T &n) { return (n==)?:(+countbit(n&(n-))); }
  38. template <class T1, class T2>
  39. bool gmax(T1 &a, const T2 &b) { return a < b? a = b, :;}
  40. template <class T1, class T2>
  41. bool gmin(T1 &a, const T2 &b) { return a > b? a = b, :;}
  42. template <class T> inline T lowbit(T x) {return x&(-x);}
  43.  
  44. template<class T1, class T2>
  45. ostream& operator <<(ostream &out, pair<T1, T2> p) {
  46. return out << "(" << p.st << ", " << p.nd << ")";
  47. }
  48. template<class A, class B, class C>
  49. ostream& operator <<(ostream &out, tuple<A, B, C> t) {
  50. return out << "(" << get<>(t) << ", " << get<>(t) << ", " << get<>(t) << ")";
  51. }
  52. template<class T>
  53. ostream& operator <<(ostream &out, vector<T> vec) {
  54. out << "("; for(auto &x: vec) out << x << ", "; return out << ")";
  55. }
  56. void testTle(int &a){
  57. while() a = a*(ll)a%;
  58. }
  59. const ll inf = 0x3f3f3f3f;
  60. const ll INF = 1e17;
  61. const int mod = 1e9+;
  62. const double eps = 1e-;
  63. const int N = +;
  64. const double pi = acos(-1.0);
  65.  
  66. /***********/
  67.  
  68. int quick(int x, long long n, int mod) {
  69. int ans = ;
  70. while(n) {
  71. if(n&) ans = ans*x%mod;
  72. x = x*x%mod;
  73. n >>= ;
  74. }
  75. return ans;
  76. }
  77.  
  78. long long get2(long long n) {
  79. long long ans = ;
  80. while(n >>= )
  81. ans += n;
  82. return ans;
  83. }
  84.  
  85. int m[] = {, , , , }; //阶乘%5
  86. int inv[] = {, , , , }; //i的逆元,写成i!的逆元,狂WA
  87. pair<long long, int> get5(long long n) {
  88. if(n < ) return {, m[n]};
  89. pair<long long, int> ret = get5(n/);
  90. ret.st += n/;
  91. ret.nd = ret.nd*quick(m[], n/, )*m[n%]%;
  92. return ret;
  93. }
  94.  
  95. int main() {
  96. int T; scanf("%d", &T);
  97. long long a[];
  98. while(T--) {
  99. int n; scanf("%d", &n);
  100. long long sum = ;
  101. for(int i = ; i < n; i++)
  102. scanf("%lld", a+i), sum += a[i];
  103. long long mod2 = get2(sum);
  104. auto mod5 = get5(sum);
  105. for(int i = ; i < n; i++) {
  106. mod2 -= get2(a[i]);
  107. auto ret = get5(a[i]);
  108. mod5.st -= ret.st;
  109. mod5.nd = mod5.nd*inv[ret.nd]%;
  110. }
  111. int ans;
  112. if(mod5.st) ans = mod2? : ;
  113. else {
  114. ans = mod5.nd;
  115. if(mod2) {
  116. if(ans&) ans = (ans+)%;
  117. }
  118. else {
  119. if(!(ans&)) ans = (ans+)%;
  120. }
  121. }
  122. printf("%d\n", ans);
  123. }
  124. return ;
  125. }

附:

一句话阐明如何求阶乘的末尾非0数

求末尾非0数模5的值,n = 5k时,

n! = (1*2*3*4) * (6*7*8*9) * ... * (5k-4)*(5k-3)*(5k-2)*(5k-1)  *5^k * k!

= (1*2*3*4/2) * (6*7*8*9/2) * ... * [(5k-4)*(5k-3)*(5k-2)*(5k-1)/2]  *10^k * k!

= (1*2*3*4/2) * (6*7*8*9/2) * ... * [(5k-4)*(5k-3)*(5k-2)*(5k-1)/2]  * k!  (去掉末尾的几个零,结果不变)

= (1*2*3*4/2) * (6*7*8*9/2) * ... * [(5k-4)*(5k-3)*(5k-2)*(5k-1)/2]  *6^k * k! (乘6,模5下末尾不变)

= (1*2*3*4*3) * (6*7*8*9*3) * ... * [(5k-4)*(5k-3)*(5k-2)*(5k-1)*3]  * k!

= 2^k * k!

阶乘末两位非0数

P = 4, B = 2;

P = 25, B = 5

再合并一下~

组合数求模

hihocoder1639 图书馆 [数学]的更多相关文章

  1. fopen的使用小记

    整理自https://msdn.microsoft.com/zh-cn/library/t3ayayh1(VS.80).aspx errno, _doserrno, _sys_errlist, and ...

  2. 【转】科大校长给数学系学弟学妹的忠告&本科数学参考书

    1.老老实实把课本上的题目做完.其实说科大的课本难,我以为这话不完整.科大的教材,就数学系而言还是讲得挺清楚的,难的是后面的习题.事实上做1道难题的收获是做10道简单题所不能比的. 2.每门数学必修课 ...

  3. MIT一牛人对数学在机器学习中的作用给的评述

    MIT一牛人对数学在机器学习中的作用给的评述 转载自http://my.oschina.net/feedao/blog/52252,不过这个链接也是转载的,出处已经无从考证了.   感觉数学似乎总是不 ...

  4. [Swift]数学库函数math.h | math.h -- mathematical library function

    常用数学函数 1. 三角函数 double sin (double);//正弦 double cos (double);//余弦 double tan (double);//正切 2 .反三角函数 d ...

  5. 数学思想:为何我们把 x²读作x平方

    要弄清楚这个问题,我们得先认识一个人.古希腊大数学家 欧多克索斯,其在整个古代仅次于阿基米德,是一位天文学家.医生.几何学家.立法家和地理学家. 为何我们把 x²读作x平方呢? 古希腊时代,越来越多的 ...

  6. 速算1/Sqrt(x)背后的数学原理

    概述 平方根倒数速算法,是用于快速计算1/Sqrt(x)的值的一种算法,在这里x需取符合IEEE 754标准格式的32位正浮点数.让我们先来看这段代码: float Q_rsqrt( float nu ...

  7. MarkDown+LaTex 数学内容编辑样例收集

    $\color{green}{MarkDown+LaTex 数学内容编辑样例收集}$ 1.大小标题的居中,大小,颜色 [例1] $\color{Blue}{一元二次方程根的分布}$ $\color{R ...

  8. 深度学习笔记——PCA原理与数学推倒详解

    PCA目的:这里举个例子,如果假设我有m个点,{x(1),...,x(m)},那么我要将它们存在我的内存中,或者要对着m个点进行一次机器学习,但是这m个点的维度太大了,如果要进行机器学习的话参数太多, ...

  9. Sql Server函数全解<二>数学函数

    阅读目录 1.绝对值函数ABS(x)和返回圆周率的函数PI() 2.平方根函数SQRT(x) 3.获取随机函数的函数RAND()和RAND(x) 4.四舍五入函数ROUND(x,y) 5.符号函数SI ...

随机推荐

  1. VS2017 C++操作mysql数据库

    1.首先安装mysql 具体教程可以参考https://blog.csdn.net/zhouzezhou/article/details/52446608 注意安装产品的时候记得选择MySQL Con ...

  2. JMeter的__threadGroupName使用注意事项

    JMeter从4.1版本开始引入了一个新函数"${__threadGroupName}",这个函数的作用是返回当前线程组的名字.${__threadGroupName}的用途也较为 ...

  3. 执行caffe的draw_net.py出现“GraphViz's executable "dot" not found”的解决方法

    控制台输入如下指令画网络图: python ../../../python/draw_net.py train.prototxt train.png --rankdir=TB (Top-Bottom形 ...

  4. 布线问题 (NYOJ38)

    布线问题 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 南阳理工学院要进行用电线路改造,现在校长要求设计师设计出一种布线方式,该布线方式需要满足以下条件:1.把所有 ...

  5. springmvc使用ajax进行数据交互时,session失效问题(@ResponseBody与session能否同时使用?)

    今天做博客demo的时候遇到了这样的问题:当我用ajax进行资源请求时,需要顺便将账户信息存入session.但是后来发现有@Responsebody标签时,直接用HttpSession存数据时,根本 ...

  6. JavaScript学习笔记(六)—— 异步编码

    第七章 异步编码 1  事件处理程序 处理程序:即网页加载完毕后将执行的代码,称回调函数或监听器: 包含:处理函数+window.onload=函数名; <script language=&qu ...

  7. 拒绝滥用golang defer机制

    原文链接 : http://www.bugclosed.com/post/17 defer机制 go语言中的defer提供了在函数返回前执行操作的机制,在需要资源回收的场景非常方便易用(比如文件关闭, ...

  8. linux后退文件夹命令

    后退文件夹: cd -  在重复一遍就是前进了

  9. 使用谷歌浏览器调试WEB前端的一些必备调试技巧

    转载:http://www.techug.com/post/chrome-debug-tips.html Chrome的开发者工具是个很强大的东西,相信程序员们都不会陌生,不过有些小功能可能并不为大众 ...

  10. a标签的href为空的问题

    在表格里写一个a标签链接刷新表格的时候,没注意,把a标签的href设置为""空字符串,导致每次刷新表格之后会再刷新一次整体页面,找了很久都没发现问题出在哪里,最后无意之间,鼠标在一 ...