对特定Q位末尾零,求解N!的N的分治算法

来源:互联网 发布:淘宝如何给差评 编辑:程序博客网 时间:2024/05/29 11:45
#include<iostream>#include<string>using namespace std;int solve(int b){int ans=0 ;while(b>0){ans+=b/5;               //计算 N! 最后连续的0的个数的公式:NUM(0)=N/5+N/25+N/125.......b/=5;//Q;为什么是这个公式?A:N!后的零的个数由N!的因子中2,5的个数决定,//而2的个数一定大于等于5的数目,故只需考虑5的个数}//上式本意:统计N之中有多少数字可以被5,25,125...整除,从而间接的得知 N! // 中有多少5的因数; return ans;}int main(){int Q;int d=500000000;              //500000000/5=1e10 够用了int s=0;cin>>Q;while(s<=d){                // 分治求范围int mid=(s+d)/2;int ans=solve(mid);if(ans>Q)d=mid-1;else if(ans<Q) s=mid+1;else cout<<mid<<endl,exit(0);}cout<<"No found\n";return 0;}