SPOJ FCTRL - Factorial

题目链接http://www.spoj.com/problems/FCTRL/

题目大意:询问N的阶乘的结果尾数有几个0.

解题思路:考虑问题:N的阶乘的结果能被2m整除,这个m最大为多少。

我们对前N个数除以2,忽略奇数,会得到N/2个数字。那么相当于我们得到了2N/2

对之后的N/2个数字继续除以2,同样忽略奇数。我们会再得到2N/4

...

所以m=N/2 + N/4 + N/8 +...+0。

那么对于这个问题,我们计算出N的记成被2m1整除的最大m1以及被5m2整除的最大m2,由于2*5=10,而10在进行阶乘计算的时候会使得结果尾数多一个0,因此我们只需要计算出N被(2*5)m整除的最大m即可。由于m1一定大于m2,所以结果就是m2.而计算m2则可以通过N/5 + N/25 +...+ 0计算得到。

代码:

 1 const int maxn = 1e5 + 5;
 2 int n;
 3
 4 void solve(){
 5     int ans = 0;
 6     int x = n / 5;
 7     while(x > 0){
 8         ans += x;
 9         x /= 5;
10     }
11     printf("%d\n", ans);
12 }
13 int main(){
14     int t;
15     scanf("%d", &t);
16     while(t--){
17         scanf("%d", &n);
18         solve();
19     }
20 }

题目:

FCTRL - Factorial

#math

The most important part of a GSM network is so called Base Transceiver Station (BTS). These transceivers form the areas called cells (this term gave the name to the cellular phone) and every phone connects to the BTS with the strongest signal (in a little simplified view). Of course, BTSes need some attention and technicians need to check their function periodically.

ACM technicians faced a very interesting problem recently. Given a set of BTSes to visit, they needed to find the shortest path to visit all of the given points and return back to the central company building. Programmers have spent several months studying this problem but with no results. They were unable to find the solution fast enough. After a long time, one of the programmers found this problem in a conference article. Unfortunately, he found that the problem is so called "Travelling Salesman Problem" and it is very hard to solve. If we have N BTSes to be visited, we can visit them in any order, giving us N! possibilities to examine. The function expressing that number is called factorial and can be computed as a product 1.2.3.4....N. The number is very high even for a relatively small N.

The programmers understood they had no chance to solve the problem. But because they have already received the research grant from the government, they needed to continue with their studies and produce at least some results. So they started to study behaviour of the factorial function.

For example, they defined the function Z. For any positive integer NZ(N) is the number of zeros at the end of the decimal form of number N!. They noticed that this function never decreases. If we have two numbers N1<N2, then Z(N1) <= Z(N2). It is because we can never "lose" any trailing zero by multiplying by any positive number. We can only get new and new zeros. The function Z is very interesting, so we need a computer program that can determine its value efficiently.

Input

There is a single positive integer T on the first line of input (equal to about 100000). It stands for the number of numbers to follow. Then there are T lines, each containing exactly one positive integer number N, 1 <= N <= 1000000000.

Output

For every number N, output a single line containing the single non-negative integer Z(N).

Example

Sample Input:

6
3
60
100
1024
23456
8735373

Sample Output:

0
14
24
253
5861
2183837
时间: 2024-12-11 11:11:06

SPOJ FCTRL - Factorial的相关文章

SPOJ Python Day1: Factorial

11. Factorial 这个题同样非常简单,就是求一个数的阶乘的尾部有多少个0. 思路是有2*5才会出0,然后2肯定比5多,所以就是数N!中有多少个因子5. 关于如何数出因子5的个数中http://www.chinaunix.net/old_jh/23/926848.html这篇文章介绍的非常详细.我就不谈了,不过想说写程序和算法是两个非常不同的工作,我现在的目标是,大概看一下前人的成法,主要完成编程工作. 最终推出的计算公式为: 当$0 < n < 5$时,$f(n!) = 0$; 当$

SPOJ:Divisors of factorial (hard) (唯一分解&amp;优化)

Factorial numbers are getting big very soon, you'll have to compute the number of divisors of such highly composite numbers. Input The first line contains an integer T, the number of test cases.On the next T lines, you will be given two integers N an

Factorial Solved Problem code: FCTRL

1 import sys 2 #import psyco #很奇怪,这题用psyco就runtime error 3 4 5 #psyco.full() 6 7 8 def z(n): #这个应该是技巧的一种算法 9 r = 0 10 while 5 <= n: 11 n /= 5 12 r += n 13 return r 14 15 16 def main(): 17 n = int(sys.stdin.readline()) 18 for t in sys.stdin: #这种循环输入一点

codechef Factorial 算法 fread读入数据

和很多oj一样都有的经典题目,就是求阶乘的尾零有多少个. 这就不能直接求阶乘的值.而是直接求5的倍数的个数就可以了. 数据量很大,有100000个,所以这里使用buffer,调用fread函数,可以大大加速程序.比一般的读写操作快10倍左右呢. 原题: http://www.codechef.com/problems/FCTRL #include <stdio.h> unsigned facZeros(unsigned n) { unsigned ans = 0; for (unsigned

SPOJ Python Day2: Small factorials

24. Small factorials 这题目非常简单,求"小整数(1-100)"的阶乘.题目规定了时间和程序大小. 所以能想到的最简单的循环,递归,和全算出来查表都是不行的. 正确的方法的算法,如这个博客所示,写的非常清楚了,数组进位法: http://www.open-open.com/home/space-135360-do-blog-id-9620.html 作者的例子举的也非常清晰. 但是...神奇的python有reduce函数,我也惊讶这个函数算阶乘这么快,直接可以AC

SPOJ 705 Distinct Substrings(后缀数组)

[题目链接] http://www.spoj.com/problems/SUBST1/ [题目大意] 给出一个串,求出不相同的子串的个数. [题解] 对原串做一遍后缀数组,按照后缀的名次进行遍历, 每个后缀对答案的贡献为n-sa[i]+1-h[i], 因为排名相邻的后缀一定是公共前缀最长的, 那么就可以有效地通过LCP去除重复计算的子串. [代码] #include <cstdio> #include <cstring> #include <algorithm> usi

SPOJ 3273

传送门: 这是一道treap的模板题,不要问我为什么一直在写模板题 依旧只放代码 1 //SPOJ 3273 2 //by Cydiater 3 //2016.8.31 4 #include <iostream> 5 #include <cstring> 6 #include <ctime> 7 #include <cmath> 8 #include <cstdlib> 9 #include <string> 10 #include

SPOJ CRAN02 - Roommate Agreement

题目链接:http://www.spoj.com/problems/CRAN02/ 题目大意:N个数字组成的序列,和为0的连续子序列的个数.N<1e6 解题思路:计算前缀和,统计每个数字出现的次数,那么对于数字sum[i], 如果存在k个sum[i],则代表有C(k, 2)个序列和为0,而如果sum[i] = 0,则还要累加上对应的k值. 代码: 1 ll n; 2 int a[maxn]; 3 ll sum[maxn]; 4 map<int, int> mmp; 5 6 void so

spoj GCJ1C09C Bribe the Prisoners

题目链接: http://www.spoj.com/problems/GCJ1C09C/ 题意: In a kingdom there are prison cells (numbered 1 to P) built to form a straight line segment. Cells number i and i+1 are adjacent, and prisoners in adjacent cells are called "neighbours." A wall wi