LightOJ 1090 Trailing Zeroes (II)

来源:互联网 发布:gif屏幕录像软件 编辑:程序博客网 时间:2024/06/16 03:03

题目分析

这道题的意思就是让你求Crnpq中末尾0的个数,那么很明显就是让你求算得的10的个数,而10能转化为2*5,那么我们就可以打表求106范围内每个数可以表示成2和5分别的个数。

#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;const int maxn = 1e6+100;#define PII pair <int, int>#define LLL long longPII p[maxn], ans[maxn];void init(){    for(int i = 1; i < maxn; i++){        int temp = i;        p[i].first = p[i].second = 0;        while(temp%2 == 0){            temp /= 2;            p[i].first++;        }        while(temp%5 == 0){            temp /= 5;            p[i].second++;        }    }    ans[1] = p[1];    for(int i = 2; i < maxn; i++){        ans[i].first = ans[i-1].first + p[i].first;        ans[i].second = ans[i-1].second + p[i].second;    }}int main(){    init();    int T, n, r, P, q;    scanf("%d", &T);    for(int kase = 1; kase <= T; kase++){        scanf("%d%d%d%d", &n, &r, &P, &q);        int x = ans[n].first, y = ans[n].second;        x -= ans[r].first;        y -= ans[r].second;        x -= ans[n-r].first;        y -= ans[n-r].second;        x += p[P].first*q;        y += p[P].second*q;        printf("Case %d: %d\n", kase, min(x, y));    }    return 0;}
0 0
原创粉丝点击