LightOJ-1090-数论

来源:互联网 发布:iphone6软件安装目录 编辑:程序博客网 时间:2024/06/05 06:43

题目大意:求C(n,r)*(p^q)末尾有几个0;

题目解析:转化一下,就是求k*10^x的x的最大值,在转化一下,就是求(2^m1)*(5^m2)*k中m1和m2的最小值;

AC代码:

#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>#include<string>using namespace std;const int maxn=1000010;int two[maxn],five[maxn];int search_2(int n){int cnt=0;while(n>0){if(n%2==0){cnt++;n/=2;}else break;}return cnt;}int search_5(int n){int cnt=0;while(n>0){if(n%5==0){cnt++;n/=5;}else break;}return cnt;}void init(){int i;two[0]=two[1]=0;five[0]=five[1]=0;for(i=2;i<=1000000;i++){two[i]=two[i-1]+search_2(i);five[i]=five[i-1]+search_5(i);}}int main(){int c,cas,p,q,n,r,i;init();scanf("%d",&cas);for(c=1;c<=cas;c++){scanf("%d%d%d%d",&n,&r,&p,&q);int t=search_2(p)*q;int f=search_5(p)*q;int tt=two[n]-two[n-r]-two[r];int ff=five[n]-five[n-r]-five[r];printf("Case %d: %d\n",c,min(tt+t,ff+f));}return 0;} 


0 0