标签:log 数论 double m2 int base kuangbin logn
LightOj 1045 Digits of Factorial
题意(好题)
给定一个数N,和进制k, 求N!在k进制下 位数的个数
思路
设进制为base,m为个数
N
!
=
b
a
s
e
m
N! = base^m
N!=basem,
m
m
m即 位数的个数
则
b
a
s
e
m
=
N
!
=
1
∗
2
∗
3
∗
4
∗
.
.
.
∗
(
n
−
1
)
∗
n
base^m = N! = 1 * 2 * 3 * 4 * ...* (n - 1) * n
basem=N!=1∗2∗3∗4∗...∗(n−1)∗n
两边同时取对数log
m
l
o
g
b
a
s
e
=
l
o
g
1
+
1
o
g
2
+
1
o
g
3
+
.
.
.
+
l
o
g
n
mlog^{base} = log1 + 1og2 + 1og3 + ..._+ logn
mlogbase=log1+1og2+1og3+...+logn
m
=
l
o
g
1
+
l
o
g
2
+
l
o
g
3
+
.
.
.
+
l
o
g
n
l
o
g
b
a
s
e
m = \frac{log1+log2+log3+...+logn}{log^{base}}
m=logbaselog1+log2+log3+...+logn
注意算的结果是下取整,则当结果m并不是恰好的数时,即存在小数的话,需要加
1
1
1
代码
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int N = 1000010;
double s[N];
void init() {
s[0] = s[1] = 0;
for (int i = 2; i < N; i ++)
s[i] = s[i - 1] + log((double)i);
}
int main() {
init();
int T;
int id = 0;
scanf("%d", &T);
while(T --) {
int n, base;
scanf("%d%d", &n, &base);
if(!n) {
printf("Case %d: %d\n", ++id, 1);
continue;
}
double c = s[n];
double m1 = c / (log((double)base));
int m2 = c / (log((double)base));
if(m2 != (int)ceil(m1)) {
m2 ++;
}
printf("Case %d: %d\n", ++ id, m2);
}
return 0;
}
标签:log,数论,double,m2,int,base,kuangbin,logn 来源: https://blog.csdn.net/exercise_smile/article/details/120537342
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。