N!的k进制位数 【打表】【斯特林公式变形】

来源:互联网 发布:python 内容管理系统 编辑:程序博客网 时间:2024/06/05 19:23

N!的位数
Time Limit:1000MS Memory Limit:131072KB 64bit IO Format:%lld & %llu
Submit

Status
Description
我们知道n!=n*(n-1)(n-2)…*2*1。

那么给定一个n,n!是几位数呢。

更困难的,n!的k进制数有多少位呢。

Input
第一行是一个数T(1≤T≤50000),代表T组测试数据。

每一组测试数据占一行,有两个整数n(0 ≤ n ≤ 10^6),k(2≤k≤1000)。

Output
对于每组测试数据,输出n!k进制数的位数。

Sample Input
2
3 10
3 2
Sample Output
1
3
学习了
和斯特林公式还是蛮像的,就是 最后除以个log(k) 就行了,还有这道题要 打表空间换时间

#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>#include<cmath>#include<queue>#include<stack>#include<map>#include<vector>#include<set>#define CLR(a,b) memset((a),(b),sizeof(a))#define inf 0x3f3f3f3f#define mod 100009#define LL long long#define M  10000000#define ll o<<1#define rr o<<1|1#define lson o<<1,l,mid#define rson o<<1|1,mid+1,rusing namespace std;void read(int &x){    x=0;char c;    while((c=getchar())<'0');    do x=x*10+c-'0';while((c=getchar())>='0');}double a[M];void dabiao(){    double d=0;    a[0]=0.0;    for(int i=1;i<M;i++)    {        d+=log(i);        a[i]=d;    }}int main(){        dabiao();     int t;     scanf("%d",&t);     while(t--)     {        int n,m;        scanf("%d%d",&n,&m);         printf("%d\n",int(a[n]/log(m))+1);     }    return 0;}
0 0
原创粉丝点击