欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

厦门理工学院oj 1225 -- 琪露诺的完美算术教室(二)

程序员文章站 2022-06-01 17:19:58
...

假设N!N!在十进制下的结果为nn,则其从mm进制转化过来时,可以写作
n=a×mkn = a \times m^k
其中aannmm进制下最高位到第一个末尾0前一位的数转为十进制,kk为末尾0的个数
5!5!在二进制下(1111000)为例,5!=15×235! = 15 \times 2^3,其中1515的二进制表示为1111,末尾0的个数为3
mm通过分解质因数,可以写成p1α1+p2α2+...+piαip_1^{\alpha1}+p_2^{\alpha2}+...+p_{i}^{\alpha i},故有
n=a×(p1α1+p2α2+...+piαi)kn = a \times (p_1^{\alpha1}+p_2^{\alpha2}+...+p_{i}^{\alpha i})^k
N!N!也可通过分解质因数写成
n=p1α1+p2α2+...+pjαjn = p_{1}^{\alpha1'}+p_{2}^{\alpha2'}+...+p_{j}^{\alpha j'}
αx=min(α1,α2,...,αi)\alpha x' = min(\alpha1', \alpha2', ..., \alpha i'),则k=αx/αxk = \alpha x' / \alpha x
那么怎么取出N!N!里质数pp的个数呢,首先从1N1\sim N中取出pp倍数的个数,接着取出p2p^2倍数的个数…,直到px>Np^x>N
α=Np+Np2+...\alpha = \lfloor \frac{N}{p} \rfloor + \lfloor \frac{N}{p^2} \rfloor + ...
在这题里很容易观察出二进制下末尾0的个数即为N!N!中质因子2的个数

#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>

typedef long long LL;

using namespace std;

int main()
{
    int T;
    cin >> T;
    while(T--)
    {
        LL n;
        cin >> n;
        LL res = 0;
        while(n)
        {
            res += n / 2;
            n /= 2;
        }
        cout << res << endl;
    }
    return 0;
}
相关标签: 厦门理工学院