冲着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