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

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

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

 ll n,x,y,P,B,s[];
ll exgcd(ll a,ll b){
if(!b)return x=,y=,a;
ll d=exgcd(b,a%b),t=x;
return x=y,y=t-a/b*y,d;
}
ll rev(ll a,ll P){exgcd(a,P);while(x<)x+=P;return x%P;}
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;}
struct Num{
ll a,b;
Num(ll a = , ll b = ): a(a), b(b){}
Num operator*(Num x){return Num(a*x.a%P, b+x.b);}
Num operator/(Num x){return Num(a*rev(x.a,P)%P, b-x.b);}
};
Num cal(ll n){return n? Num(s[n%P]*pow(s[P],n/P,P)%P,n/B)*cal(n/B): Num();}
void pre(){
for(int i = s[] = ; i < P; i++)
if(i%B) s[i]=s[i-]*i%P;
else s[i] = s[i-];
s[P] = s[P-];
}
int main(){
B = , P = , pre();
cal(n);
}

hihocoder1639 别人的题解

自己的题解如下:

 #include <bits/stdc++.h>

 #define ll long long
#define ull unsigned long long
#define st first
#define nd second
#define pii pair<int, int>
#define pil pair<int, ll>
#define pli pair<ll, int>
#define pll pair<ll, ll>
#define tiii tuple<int, int, int>
#define pw(x) ((1LL)<<(x))
#define lson l, m, rt<<1
#define rson m+1, r, rt<<1|1
#define sqr(x) ((x)*(x))
#define SIZE(A) ((int)(A.size()))
#define LENGTH(A) ((int)(A.length()))
#define FIN freopen("A.in","r",stdin);
#define FOUT freopen("A.out","w",stdout);
using namespace std;
/***********/
template<typename T>
bool scan (T &ret) {
char c;
int sgn;
if (c = getchar(), c == EOF) return ; //EOF
while (c != '-' && (c < '' || c > '') ) c = getchar();
sgn = (c == '-') ? - : ;
ret = (c == '-') ? : (c - '');
while (c = getchar(), c >= '' && c <= '') ret = ret * + (c - '');
ret *= sgn;
return ;
}
template<typename N,typename PN>inline N flo(N a,PN b){return a>=?a/b:-((-a-)/b)-;}
template<typename N,typename PN>inline N cei(N a,PN b){return a>?(a-)/b+:-(-a/b);}
template<typename T>inline int sgn(T a) {return a>?:(a<?-:);}
template<class T> int countbit(const T &n) { return (n==)?:(+countbit(n&(n-))); }
template <class T1, class T2>
bool gmax(T1 &a, const T2 &b) { return a < b? a = b, :;}
template <class T1, class T2>
bool gmin(T1 &a, const T2 &b) { return a > b? a = b, :;}
template <class T> inline T lowbit(T x) {return x&(-x);} template<class T1, class T2>
ostream& operator <<(ostream &out, pair<T1, T2> p) {
return out << "(" << p.st << ", " << p.nd << ")";
}
template<class A, class B, class C>
ostream& operator <<(ostream &out, tuple<A, B, C> t) {
return out << "(" << get<>(t) << ", " << get<>(t) << ", " << get<>(t) << ")";
}
template<class T>
ostream& operator <<(ostream &out, vector<T> vec) {
out << "("; for(auto &x: vec) out << x << ", "; return out << ")";
}
void testTle(int &a){
while() a = a*(ll)a%;
}
const ll inf = 0x3f3f3f3f;
const ll INF = 1e17;
const int mod = 1e9+;
const double eps = 1e-;
const int N = +;
const double pi = acos(-1.0); /***********/ int quick(int x, long long n, int mod) {
int ans = ;
while(n) {
if(n&) ans = ans*x%mod;
x = x*x%mod;
n >>= ;
}
return ans;
} long long get2(long long n) {
long long ans = ;
while(n >>= )
ans += n;
return ans;
} int m[] = {, , , , }; //阶乘%5
int inv[] = {, , , , }; //i的逆元,写成i!的逆元,狂WA
pair<long long, int> get5(long long n) {
if(n < ) return {, m[n]};
pair<long long, int> ret = get5(n/);
ret.st += n/;
ret.nd = ret.nd*quick(m[], n/, )*m[n%]%;
return ret;
} int main() {
int T; scanf("%d", &T);
long long a[];
while(T--) {
int n; scanf("%d", &n);
long long sum = ;
for(int i = ; i < n; i++)
scanf("%lld", a+i), sum += a[i];
long long mod2 = get2(sum);
auto mod5 = get5(sum);
for(int i = ; i < n; i++) {
mod2 -= get2(a[i]);
auto ret = get5(a[i]);
mod5.st -= ret.st;
mod5.nd = mod5.nd*inv[ret.nd]%;
}
int ans;
if(mod5.st) ans = mod2? : ;
else {
ans = mod5.nd;
if(mod2) {
if(ans&) ans = (ans+)%;
}
else {
if(!(ans&)) ans = (ans+)%;
}
}
printf("%d\n", ans);
}
return ;
}

附:

一句话阐明如何求阶乘的末尾非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. 报错:Cannot create PoolableConnectionFactory (The server time zone value 'CST' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverT

    报错:Cannot create PoolableConnectionFactory (The server time zone value 'CST' is unrecognized or repr ...

  2. Jenkins持续部署

    Jenkins持续部署 Jenkins提供很好的连续部署和交付的支持.看一下部署任何软件开发的流程,将如下图所示. 连续部署的主要部分,是确保其上面所示的整个过程是自动化的.Jenkins实现所有这些 ...

  3. 详细介绍svn在eclipse中的使用(附图解说明)

    SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS.CVS,它采用了分支管理系统,它的设计目标就是取代CVS.互联网上很多版本控制服务已从CVS迁移到Subversion ...

  4. web小结

    一.ajax 1.用于前端向服务器异步获取数据 json数组:可以直接通过数组下标获取到值 json对象:可以用“data.xx”获取到值 2.注意事项 同时请求两个ajax时,容易出现异常,第一个a ...

  5. 欧拉筛——$O(n)$复杂度的质数筛法

    欧拉筛法可以以\(O(n)\)的时间,空间复杂度求出\(1-n\)范围内的所有质数. 其核心思想是每个合数仅会被其最小的质因数筛去一次. See this website for more detai ...

  6. PASSWORD MySQL 5.6.21-1ubuntu14.04_amd64

    /***************************************************************************** The main idea is that ...

  7. uiimageview 的 animation 动画

    NSMutableArray *meiArr = [NSMutableArray arrayWithCapacity:4]; for (int i = 0; i < 4; i++) { NSSt ...

  8. split命令详解

    基础命令学习目录首页 原文链接:https://blog.csdn.net/lkforce/article/details/71547313 Linux中的文件,特别是日志文件,特别大了不好打开,可以 ...

  9. 解决iscroll.js上拉下拉刷新手指划出屏幕页面无法回弹问题

    博客已迁移至http://zlwis.me. 使用过iscroll.js的上拉下拉刷新效果的朋友应该都碰到过这个问题:在iOS的浏览器中,上拉或下拉刷新时,当手指划出屏幕后,页面无法弹回.很多人因为解 ...

  10. js/jquery去掉空格,回车,换行示例代码

    Jquery: $("#accuracy").val($("#accuracy").val().replace(/\ +/g,""));// ...