首先给出一个性质:

n!的素因子分解中的素数p的幂为:[ n / p ] + [ n / p² ] + [ n / p³ ] + ……

举例证明:

例如我们有10!,我们要求它的素因子分解中2的幂;

那么,根据公式有 [ 10 / 2 ] + [ 10 / 4 ] + [ 10 / 8 ] (后面例如[10/16]之类的都为0);

显然[ 10 / 2 ] = 5,代表了从1~10中有几个数是2的倍数:2,4,6,8,10;它们每个数都为10!提供了1个2;

之后[ 10 / 4 ] = 2,代表了从1~10中有几个数是4的倍数:4,8;那加上这两个数是为什么呢?因为在前面已经提供了5个2的基础上,4和8可以各再多提供1个2;

[ 10 / 8 ] = 1,代表了从1~10中有几个数是8的倍数:8;因为同样的,在前面的基础上,8又可以再提供一个2;

这样,可以说这个公式为什么是这样的,已经很明显了;

然后开始看题目:

题目链接:http://acm.nefu.edu.cn/JudgeOnline/problemShow.php?problem_id=118

Time Limit:1000ms Memory Limit:65536K

Description

从输入中读取一个数n,求出n!中末尾0的个数。

Input

输入有若干行。第一行上有一个整数m,指明接下来的数字的个数。然后是m行,每一行包含一个确定的正整数n,1<=n<=1000000000。

Output

对输入行中的每一个数据n,输出一行,其内容是n!中末尾0的个数。

Sample Input

3
3
100
1024

Sample Output

0
24
253

题解:

显然的,这样的数据范围下,我们不可能直接算出n!等于多少,那么我们就要来考虑n!的因式分解;

由于我们要求n!的末尾有多少个0,不难想到每个0都代表了n!的素因子中有一个2和一个5,这样才能产生一个10,进而在末尾产生一个0;

那么,我们要根据上面的定理,有:

f(2) = [ n / 2 ] + [ n / 4 ] + [ n / 8 ] + ……

f(5) = [ n / 5 ] + [ n / 25 ] + [ n / 125 ] + ……

显然,对于[ n / p^k ],不管k有多大,[ n / p ^ k ]都始终大于等于零;

显然,f(2)的项数应该要不会少于f(5),同时[ n / 2^k ]与不会小于[ n / 5^k ];

所以,n!的素因子分解式中,2的幂次数肯定多多于5的幂次数,这样,我们就可以转化为求n!的素因子分解中5的幂次数为多少;

那么,根据公式,就不难得到答案;

AC代码:

 #include<cstdio>
int n,ans;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
ans=;
for(int i=n/;i>;i/=) ans+=i;
printf("%d\n",ans);
}
}

题目链接:http://acm.nefu.edu.cn/JudgeOnline/problemShow.php?problem_id=119

Time Limit:1000ms Memory Limit:65536K

Description

小明的爸爸从外面旅游回来给她带来了一个礼物,小明高兴地跑回自己的房间,拆开一看是一个很大棋盘(非常大),小明有所失望。不过没过几天发现了大棋盘的好玩之处。从起点(0,0)走到终点(n,n)的非降路径数是C(2n,n),现在小明随机取出1个素数p, 他想知道C(2n,n)恰好被p整除多少次?小明想了很长时间都没想出来,现在想请你帮助小明解决这个问题,对于你来说应该不难吧!

Input

有多组测试数据。
第一行是一个正整数T,表示测试数据的组数。接下来每组2个数分别是n和p的值,这里1<=n,p<=1000000000。

Output

对于每组测试数据,输出一行,给出C(2n,n)被素数p整除的次数,当整除不了的时候,次数为0。

Sample Input

2
2 2
2 3

Sample Output

1
1

题解:

依然是使用上面那个定理的题目;

那么如何求得a和b呢?

显然,根据上面的公式,就有:

a = [ 2n / p ] + [ 2n / p² ] + [ 2n / p³ ] + ……

b = [ n / p ] + [ n / p² ] + [ n / p³ ] + ……

最后输出的答案就是a-2*b;

AC代码:

 #include<cstdio>
typedef long long ll;
ll n,p;
ll calc(ll n,ll p)
{
ll cnt=;
for(ll i=n/p;i>;i/=p) cnt+=i;
return cnt;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%lld%lld",&n,&p);
printf("%lld\n",calc(*n,p)-*calc(n,p));
}
}

NEFU 118 - n!后面有多少个0 & NEFU 119 - 组合素数 - [n!的素因子分解]的更多相关文章

  1. nefu 118 n!后面有多少个0 算数基本定理,素数分解

    n!后面有多少个0 Time Limit 1000ms Memory Limit 65536K description 从输入中读取一个数n,求出n! 中末尾0的个数. input 输入有若干行.第一 ...

  2. NEFU 118 n!后面有多少个0【数论】

    http://acm.nefu.edu.cn/JudgeOnline/problemShow.php?problem_id=118 求n!后面有多少个0(1<=n<=1000000000) ...

  3. 数论 - 算数基本定理的运用 --- nefu 118 : n!后面有多少个0

     题目链接:http://acm.nefu.edu.cn/JudgeOnline/problemshow.php Mean: 略. analyse: 刚开始想了半天都没想出来,数据这么大,难道是有什么 ...

  4. nefu 753 n!末尾有多少个0

    Problem : 753 Time Limit : 1000ms Memory Limit : 65536K description 计算N!末尾有多少个0 input 输入数据有多组,每组1行,每 ...

  5. N的阶乘末尾有多少个0

    N的阶乘(N!)中的末尾有多少个0? N的阶乘可以分解为: 2的X次方,3的Y次方,4的5次Z方,.....的成绩.由于10 = 2 * 5,所以M只能和X和Z有关,每一对2和5相乘就可以得到一个10 ...

  6. Trailing Zeroes (III) 假设n!后面有x个0.现在要求的是,给定x,要求最小的n; 判断一个n!后面有多少个0,通过n/5+n/25+n/125+...

    /** 题目:Trailing Zeroes (III) 链接:https://vjudge.net/contest/154246#problem/N 题意:假设n!后面有x个0.现在要求的是,给定x ...

  7. 从“n!末尾有多少个0”谈起

    在学习循环控制结构的时候,我们经常会看到这样一道例题或习题.问n!末尾有多少个0?POJ 1401就是这样的一道题. [例1]Factorial (POJ 1401). Description The ...

  8. python3 filter用法(举例求0~n之间的素数)

    在用python3求0~n之间的素数时,关于filter用法的有点模糊,于是上网查了一下filter用法. 求0~n之间素数的脚本prime.py: def f(x): plist = [0,0] + ...

  9. Swift3.0语言教程组合字符串

    Swift3.0语言教程组合字符串 Swift3.0语言教程组合字符串,当开发者想要将已经存在的字符串进行组合,形成一个新的字符串,可以使用NSString中的两个方法,分别为appending(_: ...

随机推荐

  1. 虚拟机安装linux系统无法上网的解决方法

    原文:https://www.jb51.net/article/118267.htm 周末闲来无事,用虚拟机安装了centos6.5系统,安装成功后发现不能连接网络,然后我就一脸蒙蔽了,无奈之下,只能 ...

  2. 如何重新排列数组使得数组左边为奇数,右边为偶数,并使得空间复杂度为O(1),时间复杂度为O(n)

    思路分析: 类似快速排序的处理.可以用两个指针分别指向数组的头和尾,头指针正向遍历数组,找到第一个偶数,尾指针逆向遍历数组,找到第一个奇数,使用引用参数传值交换两个指针指向的数字,然后两指针沿着相应的 ...

  3. backbone学习笔记:视图(View)

    Backbone 视图对象主要用来渲染数据,监听事件. Backbone的视图对象可以展示Model数据,也可以把用户编辑的Model数据传递到后台,可以通过监听事件操作视图里的DOM元素 举例: v ...

  4. windows应急响应入侵排查思路

    0x00 前言 ​ 当企业发生黑客入侵.系统崩溃或其它影响业务正常运行的安全事件时,急需第一时间进行处理,使企业的网络信息系统在最短时间内恢复正常工作,进一步查找入侵来源,还原入侵事故过程,同时给出解 ...

  5. vi 中大小写转换功能

    所有的操作都是围绕着“gu"和“gU”另个命令展开的.secooler的语法:[开始位置]gu/Gu[结束位置]secooler的翻译: [开始位置] ---- 可以指定开始的位置,默认是光 ...

  6. oracle如何链接到另外一个数据库DB_LINK

    命令创建从一个库连接的另外一个库: create database link DB_XXX  --创建连接的名字connect to db_xxx --数据库名identified by DB-XXX ...

  7. vc 使用ShellExecut来启动控制面板中功能模块的操作

    文件夹,文件,网址可以创建快捷方式,控制面板 中的设置也可以创建快捷方式,下面是快捷方式的命令,使用方法:在桌面或文件夹的空白处点右键,选择新建,快捷方式,在“请键入项目的位置”输入下面的命 令,然后 ...

  8. PHP curl get post通用类

    <?php /** * @author:xiaojiang * curl 通用方法 ..get /post 传送数据 */ class process{ const GET = 0; const ...

  9. Linq EF 根据字符列表排序或List根据列表排序以及Linq查询类型转换

    //model.BBSCategoryIDList=>{10,23,12}或者{1,3,2} //model.BBSCategoryIDs=>1,3,2或者10,23,12 //SqlFu ...

  10. django restframwork 教程之authentication权限

    当前我们的API在编辑或者删除的时候没有任何限制,我们不希望有些人有高级的行为,确保: 代码段始终与创建者相关联 只允许授权的用户可以创建代码段 只允许代码段创建者可以更新和删除 没有认证的请求应该有 ...