ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

kuangbin带你飞数论

2021-09-28 20:59:22  阅读:198  来源: 互联网

标签: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. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有