[素数打表][欧拉函数] 阶乘分解

阶乘分解

给定整数 N ,试把阶乘 N! 分解质因数,按照算术基本定理的形式输出分解结果中的 pi 和 ci 即可。
输入格式
一个整数N。
输出格式
N! 分解质因数后的结果,共若干行,每行一对pi,ci,表示含有pcii项。按照pi从小到大的顺序输出。
数据范围
1≤N≤106
输入样例:
5
输出样例:
2 3
3 1
5 1
样例解释
5!=120=23∗3∗5


素数打表 + 改欧拉函数。


#include
using namespace std;

const int maxn = 1e6 + 10;
int len;
mapcp;
vectorprime;
int book[maxn];
void get_prime(int n) {
    book[0] = book[1] = 1;
    for (int i = 2; i <= n; i++) {
        if (book[i] == 0) {
            prime.push_back(i);
            for (int j = i + i; j <= n; j += i) {
                book[j] = 1;
            }
        }
    }
}
void eular(int n) {
    int res = n;
    for (int i = 0; i < len && res != 1; i++) {
        if (res % prime[i] == 0) {
            while(res % prime[i] == 0) {
                cp[prime[i]] += 1;
                res /= prime[i];
            }
        }
    }
}
int main () {
    int n;
    cin >> n;
    get_prime(n);
    len = prime.size();
    for (int i = 2; i <= n; i++) {
        eular(i);
    }
    map::iterator it = cp.begin();
    for (;it != cp.end(); it++) {
        cout << it->first << " " << it->second << "\n";
    }
    return 0;
}

你可能感兴趣的:(蓝桥杯)