给定n,(n<=10^3),然后输入n的数a[i],(a[i]<=1e10),求ans=(a1+a2+a3...an)! / (a1!*a2!*a3!...an!) 的结果的最一位数。

适用问题,n种物品,求全排种类,结果%10。

猜想1,斯特林公式,斯特林公式虽然误差越来越小,但是最后一位的误差是难以消除的,虽然求位数还稳,但是求最后一位几乎不会对。

猜想2,a[]达到一定程度,答案是0,此种情况必须保证ans的2因子和5因子数都>0,小范围唯一分解,但依然有30%数据过不去。

猜想3:唯一分解,但是素数太多,而且又得具体到每一个的逆元,难以实现。

猜想4:将ans转化为5的倍数*非5的倍数,以及2的倍数以及非2的倍数,然后剩余定理得计解。

即,将ans%10,改为%素数p,p=2时:ans2=ans%2;      p=5时:ans5=ans%5,然后中国剩余定理得到ans%10;

以5为例,算出分解后5因子的个数x:令ans5=((5^x) *y)/z%5,如果x>0,则ans5%5=0;否则得到分子的y和z。 得到ans5=(y/z)% 5。

得到x的具体实现:

以5为例,N!= (5^x)*y ,则x=N/5+N/5/5+N/5/5/5...。对于不是5的倍数的部分,以5为循环节计算。

坑点在于:5的倍数里面的数一定要算干净,所以要一层一层继续算系数,如:100=5*5*2,这个2是有用的,我就是这里没想到然后挂了。

1,2,3,4,5,6,7,8,9,10,11...=1,2,3,4,1*5,1,2,3,4,2*5,1...  (循环节为5) = [ (24%5)^ (n/5) ]%5 * (5^x) * 1*2*3 ...(后面的123是系数)

#include<cstdio>
#include<cstdlib>
#include<iostream>
using namespace std;
#define ll long long
ll a[],ans2,ans5, x[],sum;
int qpow(int n,ll m,int Mod)
{
int res=;n%=Mod;
while(m){
if(m&) res=n*res%Mod;
n=n*n%Mod;
m>>=;
} return res;
}
void get(int opt,ll x,int sig)
{
ll tmp=x;
if(sig==||sig==-){
if(tmp){
a[opt]+=sig*(tmp/opt);
tmp/=opt;
}
if(tmp){
get(opt,tmp,*sig); //5的倍数的系数不要搞忘
get(opt,tmp,*sig);
}
}
else{
tmp=;
for(int i=;i<opt;i++){
tmp=tmp*i%opt;
}
tmp=qpow(tmp,x/opt,opt);
for(ll i=(x/opt)*opt+;i<=x;i++) tmp=tmp*(i%opt)%opt;
if(opt==&&sig==) a[]=a[]*tmp%opt;
if(opt==&&sig==) a[]=a[]*tmp%opt;
if(opt==&&sig==-) a[]=a[]*tmp%opt;
if(opt==&&sig==-) a[]=a[]*tmp%opt;
}
}
int main()
{
int T,n;
scanf("%d",&T);
while(T--){
sum=; ans2=ans5=;
a[]=a[]=; a[]=a[]=a[]=a[]=;
scanf("%d",&n);
for(int i=;i<=n;i++){
scanf("%lld",&x[i]);
sum+=x[i];
}
get(,sum,); //正数表示在分子
get(,sum,);
get(,sum,); //1表示2或5的幂,可以加。
get(,sum,); //1表示非2或5的幂。
for(int i=;i<=n;i++){
get(,x[i],-); //负数表示在分母
get(,x[i],-);
get(,x[i],-);
get(,x[i],-);
}
if(a[]>&&a[]>){ //下面的可以不算,但是算也花不了多少时间。
printf("0\n");
continue;
} ans2=qpow(,a[],);
ans2=ans2*a[]%;
ans2=ans2*qpow(a[],,)%; ans5=qpow(,a[],);
ans5=ans5*a[]%;
ans5=ans5*qpow(a[],,)%; printf("%lld\n",(*ans2+*ans5)%); //5和16都是逆元算的
} return ;
}

Hihocder 1639 : 图书馆 (组合数+唯一分解 求最后一位)(妙)的更多相关文章

  1. 有关求第n位xxx 的算法的问题

    最近,博客园上看到有关求 斐波那契数列的第n位是什么的问题.什么是 斐波那契数列? 我自己也忘记了,后来百度了下.http://baike.baidu.com/view/816.htm?fr=alad ...

  2. Java蓝桥杯练习题——求小数n位后3个数

    求整数除法小数点后第n位开始的3位数 位数不足的补0,如0.125小数第3位后三位:0.12500→500 输入格式:a b n,空格分开,a是被除数,b是除数,n是小数后的位置 输出格式:3位数字, ...

  3. 51nod 1118 机器人走方格 解题思路:动态规划 & 1119 机器人走方格 V2 解题思路:根据杨辉三角转化问题为组合数和求逆元问题

    51nod 1118 机器人走方格: 思路:这是一道简单题,很容易就看出用动态规划扫一遍就可以得到结果, 时间复杂度O(m*n).运算量1000*1000 = 1000000,很明显不会超时. 递推式 ...

  4. hihoCoder #1639 图书馆

    题目大意 给定 $n$($1\le n\le 1000$)个正整数 $a_1, a_2, \dots, a_n$($a_i \le 10^{12}$),令 $s$ 为这 $n$ 个数之和.求 $$ \ ...

  5. 组合数性质求K个数选取i*j个数分成j组的方案数

    分析:设方案数为ANS,C代表组合数: ANS=(C[K,I]*C[K-I,I][K-2*I,I]*...*C[K-(J-1)*I,I])/(J!); 也即: ANS=C[K,I*J]*(C[I*J, ...

  6. [uva11174]村民排队 递推+组合数+线性求逆元

    n(n<=40000)个村民排成一列,每个人不能排在自己父亲的前面,有些人的父亲不一定在.问有多少种方案. 父子关系组成一个森林,加一个虚拟根rt,转化成一棵树. 假设f[i]表示以i为根的子树 ...

  7. 机器学习入门-数值特征-数据四分位特征 1.quantile(用于求给定分数位的数值) 2.plt.axvline(用于画出竖线) 3.pd.pcut(对特征进行分位数切分,生成新的特征)

    函数说明: 1.  .quantile(cut_list) 对DataFrame类型直接使用,用于求出给定列表中分数的数值,这里用来求出4分位出的数值 2.  plt.axvline()  # 用于画 ...

  8. tr循环,每行 2个数相加 求出和位第三个数赋值 (http://jsfiddle.net/hgeL44rz/113/)

    <table id="tb"> <tr> <th>单价</th> <th>数量</th> <th> ...

  9. 数组中出现一次的两个数(三个数)& 求最后一位bit为1

    对于两个数,对于结果中,剩余bit1来异或区分. 下面的解法,非常精简: int lastBitOf1(int number) { ); } void getTwoUnique(vector<i ...

随机推荐

  1. iOS开发 绘图详解

    Quartz概述 Quartz是Mac OS X的Darwin核心之上的绘图层,有时候也认为是CoreGraphics.共有两种部分组成   Quartz Compositor,合成视窗系统,管理和合 ...

  2. Cocos2d-x学习笔记(18)(TestCpp源代码分析-2)

    本章主要讲controller.h/cpp文件的分析,该文件主要用于演示样例场景管理类TestController,用于显示全部演示样例的菜单. //controller.cpp #include & ...

  3. 如何在Linux中使用sFTP上传或下载文件与文件夹

    如何在Linux中使用sFTP上传或下载文件与文件夹 sFTP(安全文件传输程序)是一种安全的交互式文件传输程序,其工作方式与 FTP(文件传输协议)类似. 然而,sFTP 比 FTP 更安全;它通过 ...

  4. javascript之Ajax获取和设置标头

    XMLHttpRequest对象中与标头有关的方法: setRequestHeader(<header>,<value>)--用指定值设置标头. getResponseHead ...

  5. 现成Android 5.0系统源代码

    让Android融入我的生活! 写Android一段时间了,每次看到网上一些大牛的博客.分析Android底层Zygote启动.Activity启动.View的绘制过程.SurfaceFlinger. ...

  6. C语言-回溯例4

    1,问题提出 日本数学家桥本吉彦教授于1993年10月在我国山东举行的中日美三国数学教育研讨会上向与会者提出以下填数趣题: 把1,2,...,9这9个数字填入下式的九个方格中(数字不得重复),使下面 ...

  7. CUGBACM_Summer_Tranning1 二进制枚举+模拟+离散化

    整体感觉:这个组队赛收获还挺多的.自从期末考试以后已经有一个多月没有 做过组队赛了吧,可是这暑假第一次组队赛就找回了曾经的感觉.还挺不错的!继续努力!! 改进的地方:这次组队赛開始的时候题目比較难读懂 ...

  8. 详谈kubernetes更新-2

    系列目录 本文详细探索deployment在滚动更新时候的行为 要详细探讨的参数描述: livenessProbe:存活性探测.判断pod是否已经停止 readinessProbe:就绪性探测.判断p ...

  9. datatables参数配置详解

    //@translator codepiano //@blog codepiano //@email codepiano.li@gmail.com //尝试着翻译了一下,难免有错误的地方,欢迎发邮件告 ...

  10. iOS 后台返回json解析出现的null的解决办法

    在后台返回值为Null为空时,我们代码没有判断时,程序就会崩溃.当时一直很疑惑是为啥,后来发现是数据问题,由于服务器的数据库中有些字段为空,然后以Json形式返回给客户端时就会出现这样的数据.当我们通 ...