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

xiaoxiao2021-02-28  115

#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; }
转载请注明原文地址: https://www.6miu.com/read-53681.html

最新回复(0)