标签:算法
冲着51nod新UI去做了题,顺便总结一下,这里有2道阶乘的题,
一个数N(1 <= N <= 10^9)
输出0的数量
5
1
好吧,确实,问题就是,末尾的0是怎么构成的,仔细想一下,还是能想出来,是5和其他偶数相乘得到的,这样下去,是不是只要因子5的个数就好了?确实,因为从1~N的阶乘中,凡是遇到5的倍数的,之前都有偶数,如下:
1, 2, 3, 4, 5, 6, 7, 8, 9, 10 .....5n-1, 5n....N
5之前有偶数2和4,10之前有偶数6和8,这样,每个5n之前都有偶数能够跟它构成阶乘末尾的一个0,把这些5n抽出来,可以得到 5^k * k! (k = N/5) ,这样,可以先得到k个5,然后再递归求k!中5的个数,就可以求出因子5的个数了,好了,上代码:
#include <iostream> using namespace std; int main(){ int a, ans = 0; cin >> a; while(a){ a /= 5; ans += a; } cout << ans; return 0; }之前写了个递归,这样就能AC了。
两个数N,P,中间用空格隔开。(N < 10000, P < 10^9)
输出N! mod P的结果。
10 11
10
#include <iostream> using namespace std; int main(){ long long N, P, ans = 1; cin >> N >> P; for(long long i = 2; i <= N; i++){ ans = (ans * i) % P; if(ans == 0) break; } cout << ans; return 0; }这里如果用int的话,是不能通过的。
标签:算法
原文地址:http://blog.csdn.net/kamsau/article/details/42819315