超级阶乘(中上等)

1995年,尼尔·斯洛恩和西蒙·普劳夫定义了超级阶乘(superfactorial)为首n个阶乘的积。即f(n)=1!×2!×3!×...×n!,这是一个很大的数字,我们可能不太容易求出来,为了简化问题我们只求他们的位数。

输入一个T,下面有T组数据(1<=T<=10000)

每组数据包含一个n(1<=n<=100000);

输出f(n)的位数

2

2

3

1

2

题目分析

由于n比较大所以完全不能使用暴力算法,必须使用预处理。

f(n) = 1!×2!×.......(n-1)!×n!

求位数时候

f(n)的位数 = lg(f(n)) + 1 = lg(1!×2!×.......(n-1)!×n! ) +1 = lg(1!) +.............+lg(n-1)! + lg(n!) + 1;

阶乘也可以化简为lg(n!) = lg(1×2......................×n) = lg(1)+lg(2)+..........+lg(n)

#include<stdio.h>
#include<math.h>
#include<string.h>

#define maxn 100005

double f[maxn];

int main()
{
    int i, T;
 
//    freopen("1.in", "r", stdin);
//    freopen("1.out", "w", stdout);

for(i=1; i<maxn; i++)
        f[i] = f[i-1] + log10(i);//先求阶乘的位数
    for(i=1; i<maxn; i++)//求超级阶乘的位数
        f[i] += f[i-1];

scanf("%d", &T);

while(T--)
    {
        int n;

scanf("%d", &n);

printf("%.0f\n", f[n]+1);
    }

return 0;
}

/*
1 1 1
2 2 1
3 12 2
4 288 3
5 34560 6
6 24883200 8
7 125411328000 12
8 5056584744960000 17
9 1834933472251084800000 22
10 6658606584104736800000000000 29
11 265790267296391960000000000000000000 36
12 127313963299399430000000000000000000000000000 45
13 792786697595796870000000000000000000000000000000000000 55
14 69113789582492716000000000000000000000000000000000000000000000000 66

*/

时间: 2024-10-24 21:24:26

超级阶乘(中上等)的相关文章

阶乘中0的个数

任何一个数分解质因数后,表达为2的x1次方   *     3的x2次方   *    5 的x3次方  等等 0的来源于2*5,x1>x2 ,所以阶乘中0的个数为5的个数,下面就很简单了. http://acm.nyist.net/JudgeOnline/problem.php?pid=84 import java.util.Scanner; public class Main { public static void main(String[] args) { // TODO Auto-ge

计算n阶乘中尾部零的个数

写在前面 本来觉得问题挺容易的,不打算记录,谁知道一不小心,还真没做出来.最终凭借"朴实"的算法思想解决了问题,但是其中的曲折还真是汗颜.科学的思维指导确实必不可少,"野路子"的朴素的战斗理论不论是效率还是后续的算法演进都经不起考验. 这里只是记录一下自己最近两天对此问题的一些想法,目前只能说是解决了问题,并且满足题目要求.据说问题来自<编程之美>,以后刷书本的时候看到原题,如果需要补充的话,再来更新. And,开始吧~ 正文 题目 设计一个算法,计算出

以下模块打印出超级块中某些字段的内容

以下模块打印出超级块中某些字段的内容. #include <linux/module.h> #include <linux/fs.h> #include <linux/init.h> #include <linux/list.h> #include <linux/spinlock.h> #include <linux/kdev_t.h> #define SUPER_BLOCKS_ADDRESS 0xc048db0c // from /

nyoj 56 阶乘中素数的个数

给定两个数m,n,其中m是一个素数. 将n(0<=n<=10000)的阶乘分解质因数,求其中有多少个m. 输入 第一行是一个整数s(0<s<=100),表示测试数据的组数随后的s行, 每行有两个整数n,m. 假设m=5,n=26;26!中5的个数为多少呢?只有5的倍数中含有5 1. 5 10 15 20 25 共5个(26/5) 2.这个时候,我们认为有些数中有多个5,比如25,将上述数全部除以5, 1 2 3 4 5  存在一个5(5/5) 所以共6个. 简单来说就是 sum=0

CodeIgniter学习笔记(五)——CI超级对象中的uri

uri是CI_Uri类型对象,通过$this->uri获取,用于处理与URL工作,包括从URL中获取参数等 通过URL传递get参数往往使用这种形式:http://localhost/study_codeIgniter/index.php/index/index2?id=5,但在PHP框架中,基本使用pathinfo,形式像这样:协议://域名/控制器/方法名/参数名1/参数值1/参数名2/参数值2,例如这个URI:http://localhost/study_codeIgniter/index

CodeIgniter学习笔记(六)&mdash;&mdash;CI超级对象中的input输入类

input是CI_Input类型对象,通过$this->input获取,它提供获取用户输入信息的方法,比如: post方法:用于获取通过post方法传递过来的参数 get方法:用于获取通过get方法传递过来的参数 post_get方法:用于获取post或get方法传递过来的参数,优先考虑post参数 get_post方法:用于获取post或get方法传递过来的参数,优先考虑get参数 server方法:获取$_SERVER中的值 cookie方法:获取$_COOKIE中的值 set_cookie

SCU - 2763 Factorial(任意阶乘中任意数的次数)

题目: Description Robby is a clever boy, he can do multiplication very quickly, even in base-2 (binary system), base-16 (hexadecimal system) or base-100000. Now he wants to challenge your computer, the task is quite simple: Given a positive integer N,

2.2阶乘中末尾0的个数

#include<iostream> using namespace std; int count(int N) { if(N==0) return 0; int num=0; for(int i=1;i<=N;++i) { int j=i; while(j%5==0) { num++; j/=5; } } return num; } int aa(int N) { int sum=0; while(N) {sum+=N/5; N/=5;} return sum; } int main(

n的阶乘结果中一共有多少个零?

题目:n的阶乘中一共有多少个零? 解答:产生零的结果只能有一种可能性那就是2*5=10,然而n的阶乘本质上是可以拆解为很多2和5以及其他不包含2和5的乘数的积,例如5的阶乘:1*2*3*4*5=1*2*3*2*2*5.按照这个思路,将n的阶乘乘积的每一项进行拆解,看看可以拆解出多少个2和多少个5,然后取2的个数和5的个数中最小的即可.程序代码如下: #include <stdio.h> int compute_zero(int n) { int five_count = 0; int two_