SOJ 1119 Factstone Benchmark

来源:互联网 发布:淘宝原单尾货好的店铺 编辑:程序博客网 时间:2024/06/06 00:58

题目传送门在此

题目大意可以概括为找出比2的k次方小的最大阶乘数,一开始有冲动自己用位操作做,后来想到当k上几百的时候连long long也存不下,又想到高精度,可是还是觉得不行。后来查了查确认是要用数学的办法。

新概念:斯特林公式

当然这里其实也不必用到真的斯特林公式,但在维基百科上找到了一条很有启发性的公式:


既然我们有限制条件,可以推出


如此将一个指数级问题转化为了线性问题

代码如下:

#include <cstdio>#include <cmath>int main() {    int year;    while (scanf("%d", &year) && year) {        int p = year / 10 - 194;        int max = 1 << p;        int n = 2;    double sum = 0.0;         while (sum <= max) {             sum += log(n) / log(2);             ++n;         }        printf("%d\n", n - 2);    }    return 0;}


0 0
原创粉丝点击