题目分析
这道题的意思就是让你求 Crn∗pq 中末尾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 long
PII 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;
}