找出这个数含有多少个2,或者5,然后最少有几对2*5就是有几个末尾0。
#include <cstdio>
#include <cstring>
#include <cmath>
#include <vector>
#include <iostream>
using namespace std;
const int maxn=1e6+10;
int t,n,r,p,q;
int sum2[maxn],sum5[maxn];
void ini()//前1e6个数2.5的个数,求前缀和
{
memset(sum2,0,sizeof(sum2));
memset(sum5,0,sizeof(sum5));
for(int i=2;i<maxn-5;i++)
{
int x;
x=i;
while(x%2==0)
{
x/=2;
sum2[i]++;
}
x=i;
while(x%5==0)
{
x/=5;
sum5[i]++;
}
sum2[i]+=sum2[i-1];
sum5[i]+=sum5[i-1];
}
}
int main()
{
ini();
scanf("%d",&t);
for(int i=1;i<=t;i++)
{
scanf("%d%d%d%d",&n,&r,&p,&q);
long long int num2=sum2[n]-sum2[r]-sum2[n-r]+(sum2[p]-sum2[p-1])*q;
long long int num5=sum5[n]-sum5[r]-sum5[n-r]+(sum5[p]-sum5[p-1])*q;
long long int ans=min(num2,num5);
printf("Case %d: %lld\n",i,ans);
}
return 0;
}