求x!在k进制下后缀和的个数

20分:
    求十进制下的x!后缀和的个数

40分:

高精求阶乘,直接模拟过程 (我不管反正我不打,本蒟蒻最讨厌高精了)

60分
   
利用一个定理(网上有求x!在10进制、2进制下后缀和的个数的题,原理一样)

 证明:(转自http://www.cnblogs.com/dolphin0520/

求n的阶乘某个因子a的个数,如果n比较小,可以直接算出来,但是如果n很大,此时n!超出了数据的表示范围,这种直接求的方法肯定行不通。其实n!可以表示成统一的方式。

    n!=(k^m)*(m!)*a   其中k是该因子,m=n/k,a是不含因子k的数的乘积

    下面推导这个公式

    n!=n*(n-1)*(n-2)*......3*2*1

    =(k*2k*3k.....*mk)*a      a是不含因子k的数的乘积,显然m=n/k;

    =(k^m)*(1*2*3...*m)*a

    =k^m*m!*a

    接下来按照相同的方法可以求出m!中含有因子k的个数。

    因此就可以求除n!中因子k的个数

上代码:

 long long fac(long long x,long long y)
{
if (x<y)
return ;
else
return x/y+fac(x/y,y);
}

比如样例:求10!在40进制下后缀和的个数

X!转40进制只需不停地除以40,所以后缀零的个数等于x!能整除40 的个数。那么决定x!能整除多少个40的原因在于40的质因子(40=2*2*2*5=2^3+5^1),所以只要求在x!中40的某一质因子出现的次数,最后求出最少出现次数就行。根据质因子分解计算k的质因子p在x!中出现的次数:

可分解为x!=x*p^e的形式,e=x/p + x/p^2 + x/p^3+ ……,根据这个公式就能写出以下函数

再上个代码:

 #include<iostream>
#include<cstdio>
#include<cmath>
#define N 3000001
using namespace std;
long long a[N],b[N];//a数组存k的质因子,b数组存k的某质因子的个数
long long sum;
long long n,k;
long long ans=0x7fffffffffffffff,temp;
void fenjie(long long s) //求质因子及个数 (大概不需要解释了吧。。。)
{
long long i,j=;
for (i=;i*i<=s;i++)
if (s%i==)
{
long long count=;
a[j]=i;
while (s%i==)
{
count++;
s/=i;
}
b[j++]=count;
}
if (s>)
{
a[j]=s;
b[j++]=;
} //可能容易遗漏,即k本身是质数
sum=j;
} long long fac(long long x,long long y)
{
if (x<y)
return ; //判断x是否小于y,若小于,结束统计(否则会一直做下去)
else
return x/y+fac(x/y,y); //统计n!中a[i]出现的次数
} int main()
{
while (scanf("%lld%lld",&n,&k)==) //多组数据嘿嘿嘿(反正有人因为这个没分)
{
fenjie(k);
for(int i=;i<sum;i++)
{
temp=fac(n,a[i]);
temp/=b[i]; //注意,k可以分解为多个a[i],所以temp还要再除以a[i]的个数
ans=ans>temp?temp:ans;
}
printf("%lld\n",ans);
}
return ;
}

100分:

洛谷给出的终极巨无霸正解要用到Pollard rho算法来求k的质因子及其个数(反正我不会,而且代码超级长),我直接用了博客上的模板提交,发现确实不超时了,但莫名奇妙地wa了三个点。。。反正赛后改了数据还是ac了。

 

求x!在k进制下后缀零的个数(洛谷月赛T1)的更多相关文章

  1. (找到最大的整数k使得n! % s^k ==0) (求n!在b进制下末尾0的个数) (区间满足个数)

    题目:https://codeforces.com/contest/1114/problem/C 将b分解为若干素数乘积,记录每个素数含多少次方 b = p1^y1·p2^y2·...·pm^ym. ...

  2. 牛客小白月赛6 水题 求n!在m进制下末尾0的个数 数论

    链接:https://www.nowcoder.com/acm/contest/135/C来源:牛客网 题目描述 其中,f(1)=1;f(2)=1;Z皇后的方案数:即在Z×Z的棋盘上放置Z个皇后,使其 ...

  3. n!在k进制下的后缀0

    问n! 转化成k进制后的位数和尾数的0的个数.[UVA 10061 How many zeros and how many digits?] Given a decimal integer numbe ...

  4. bzoj 3000 Big Number 估算n!在k进制下的位数 斯特林公式

    题目大意 求n!在k进制下的位数 2≤N≤2^31, 2≤K≤200 分析 作为数学没学好的傻嗨,我们先回顾一下log函数 \(\log_a(b)=\frac 1 {log_b(a)}\) \(\lo ...

  5. 51 Nod 1116 K进制下的大数

    1116 K进制下的大数  基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题  收藏  关注 有一个字符串S,记录了一个大数,但不知这个大数是多少进制的,只知道这个数 ...

  6. SDUT 3503 有两个正整数,求N!的K进制的位数

    有两个正整数,求N!的K进制的位数 题目链接:action=showproblem&problemid=3503">http://sdutacm.org/sdutoj/prob ...

  7. 求一个数的阶乘在 m 进制下末尾 0 的个数

    题意 : 求一个数 n 的阶层在 m 进制下末尾 0 的个数 思路分析 : 如果是 10 进制地话我们是很容易知道怎么做的,数一下其对 5 约数地个数即可,但是换成 m 进制的话就需要先将 m 分解质 ...

  8. 陕西师范大学第七届程序设计竞赛网络同步赛 F WWX的礼物【数学/k进制下x^n的位数/log】

    链接:https://www.nowcoder.com/acm/contest/121/F来源:牛客网 题目描述 WWX的女朋友送给了他一个礼物,可是礼物却被一把K进制密码锁锁住了.在礼物盒上还有一张 ...

  9. 数位DP 求K进制下0~N的每个数每位上出现的数的总和

    好久没写博客了,因为感觉时间比较紧,另一方面没有心思,做的题目比较浅也是另一方面. 热身赛第二场被血虐了好不好,于是决定看看数位DP吧. 进入正题: 如题是一道经(简)典(单)的数位dp. 第一步,对 ...

随机推荐

  1. Python编程基础环境安装

    安装python2.7 wget https://www.Python.org/ftp/Python/2.7.8/Python-2.7.8.tgz tar xvf Python-2.7.8.tgzcd ...

  2. HLog工作原理

  3. megacli在线raid构建详解(转载自用)

    版权声明:本文为博主原创文章,未经博主允许不得转载,转载附上原文链接即可. https://blog.csdn.net/GX_1_11_real/article/details/83213959 ht ...

  4. 如何获取Expression Design 4工具与Expression Blend 4工具

    在VS2010+C#+WPF 开发项目过程中涉及到界面的布局与设计,网上有人讲采用Expression Design 4与Expression Blend 4工具相当方便, 于是决定试看看,下面将这个 ...

  5. C#多线程之间事件通知

    我有两个线程,线程1接受网络数据,存到队列;线程2取队列,进行各种复杂的处理然后绘制到界面上;想让线程1有数据了通知线程2,线程2再取队列,因为不通知的话,线程2一直在while循环检索队列时候有东西 ...

  6. Eclipse、MinGW、JNI编写C++生成dll, Java端调用的完整示例(附java.lang.UnsatisfiedLinkError解决方法)

     Eclipse.MinGW.JNI编写C++生成dll, Java端调用的完整示例(附java.lang.UnsatisfiedLinkError解决方法) 问题背景:之前的JNI编程都是基于And ...

  7. 前言-使用Eclipse创建SpringBoot项目

    1.首先我们需要安装STS插件:Help--> Eclipse Marketplace 2. 然后 File-->New--->Spring Starter  Project 3.下 ...

  8. Mybatis 框架搭建实例

    前言 MyBatis是一个优秀的持久层框架.原生的jdbc操作存在大量的重复性代码(如注册驱动,创建连接,创建statement,结果集检测等).框架的作用就是把这些繁琐的代码封装. MyBatis通 ...

  9. Redis数据库在ubuntu16.04下的安装

    1.安装 sudo apt-get install redis-server 2.启动 sudo service redis-server start 3.查看 ps aux|grep redis 4 ...

  10. Python 可变类型和不可变类型,以及其引用

    基本数据类型的引用        在Python中定义一个数据便在内存中开辟一片空间来存储这个变量的值,这块已经被分配的内存空间便会有一个内存地址.访问这块内存需要用到变量名,变量名实际存储的是变量的 ...