给定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 ;
}

最新文章

  1. Cesium应用篇:3控件(6) FullScreen/ VR / Home
  2. 例子:Execution Model Sample - 应用状态保存
  3. 【其他】win7创建wifi热点共享给手机使用
  4. linux系统的初化始配置 IP 主机名 防火墙 selinux
  5. https资料
  6. 一个for列出横纵坐标
  7. apache2反向代理node.js应用
  8. hdu1301Jungle Roads
  9. 轻量级MVC标准
  10. group by java实现
  11. HDU 2089 不要62(数位DP)
  12. Web之CSS开发技巧: CSS @media
  13. GDAL库学习笔记(1):无缝拼接Google卫星图
  14. java自己主动打开包装盒很容易导致两个误区
  15. Mysql insert声明优化
  16. MEF初体验之一:在应用程序宿主MEF
  17. HDU4828 Grids 2014百度之星预赛问题解决
  18. InnoDB表要建议用自增列做主键
  19. App测试方法总结
  20. JS-基础动画心得

热门文章

  1. scrapy 启动失败,scrapy startproject test 出错 &#39;module&#39; object has no attribute &#39;OP_NO_TLSv1_1
  2. 使用zerorpc踩的第一个坑:
  3. HDOJ1071
  4. mySql 主从复制linux配置
  5. vue2.0 + vux (二)Footer组件
  6. android页面间传递对象
  7. Ubuntu下编译Poco库
  8. javascript 高级编程系列 - 继承
  9. beifen---http://vdisk.weibo.com/s/uhCtnyUhD0Ooc
  10. Android.mk: recipe commences before first target. Stop.