【斯特林公式】N!的k进制位数

该博客主要讨论斯特林公式在计算阶乘n!的k进制位数问题上的应用。针对给定的n和k,文章提供了计算n!在k进制下位数的方法,并包含输入输出描述及样例输入输出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

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

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

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

输入

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

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

输出

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

样例输入

2
3 10
3 2

样例输出

1
3
最后除以log(k)
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
#include<cmath>
const double Pi=acos(-1.0);
const double e=exp(1.0);
/*斯特林公式N!=sqrt(2*Pi*N)*(N/e)N次方,Pi=acos(-1.0) e=exp( -1.0 )*/
int main(){
int t;
scanf("%d",&t);
double n,k;
while(t--){
	scanf("%lf%lf",&n,&k);
	if(n==0||n==1)
	printf("1\n");
	else if(n==2&&k==2)
    printf("2\n");
	else
	printf("%.0lf\n",floor((log(sqrt(2*1.0*Pi*n))+n*log(n*1.0/e))/(log(k)))+1);
}
	return 0;
} 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值