题意:给你两个整数N和K,要求你输出N!的K进制的位数。
题解:首先补了一下对数的运算法则。 1.loga(mn)=loga(m)+loga(n)loga(mn)=loga(m)+loga(n) 2.loga(mn)=loga(m)−loga(n)loga(mn)=loga(m)−loga(n) 3.loga(mn)=nloga(m)loga(mn)=nloga(m) 4.loga(m−−√n)=1nloga(m)loga(mn)=1nloga(m) 再有一个n!n!的近似值公式,就是斯特林公式。 n!≈2πn−−−√(ne)nn!≈2πn(ne)n 于是我们就可以求答案了。 ans=logk(n!)+1ans=logk(n!)+1 =>ans=logk(2πn−−−√(ne)n)+1ans=logk(2πn(ne)n)+1 =>ans=logk(2πn−−−√)+logk((ne)n)+1ans=logk(2πn)+logk((ne)n)+1 =>ans=12logk(2πn)+nlogk(ne)+1ans=12logk(2πn)+nlogk(ne)+1 注意当n比较小的时候结果误差较大,可以直接暴力计算。 代码#include#include using namespace std;typedef long long ll;const double pi=acos(-1),e=exp(1);ll n,k;double ans;int main(){ while(~scanf("%lld%lld",&n,&k)){ if(n<=10000){ ans=1; for(int i=1;i<=n;i++){ ans=ans+log(i)/log(k); } printf("%lld\n",(ll)ans); }else{ ans=0.5*log(2*pi*n)/log(k)+n*log(n/e)/log(k)+1; printf("%lld\n",(ll)ans); } } return 0;}