描述
给定一个正整数N,将他分解成N=p1k1*p2k2*…pm^km.其中p1<p2<…<pm分别为素数。
输入格式:
输入正整数N(1<N<2^63-1)
输出
输出分解的表达式
输入示例
97532468
输出示例
97532468=2^21117101*1291
#include <cstdio>
#include <cmath>
#include <cstring>
const int maxn = 10000;
int prime[maxn]; // 素数表
int mask[maxn]; // 筛选区间
int ind = 0;
void buildPrime() {
// 用筛选法构造素数表
for(int i=0; i<maxn; i++) {
mask[i] = 1;
}
for(int i=2; i<maxn; i++) { // 从小到大检查mask[i]
if(mask[i]) { // mask[i]==1表示i不是[2, i-1]倍数
prime[ind++] = i;
for(int j=i*i; j<maxn; j+=i) { // 将i的倍数(j)的数全部标记为非素数
mask[j] = 0;
}
}
}
}
int b[maxn];
void p(int a, int d) {
// 将a质因子分解
for(int i=0; i<ind; i++) { // 检查每个素数是否被整除
while(a%prime[i]==0) {
a /= prime[i]; // 除以这个素数
b[i] += d; // 对应的指数加d,d为正负一,对应乘法和除法
}
if(a==1) {
break;
}
}
}
void fac(int a, int d) {
// 将a的阶乘做质因子分解
for(int i=1; i<=a; i++) {
p(i, d);
}
}
int main() {
buildPrime();
int a, bb, c, d;
while(scanf("%d%d%d%d", &a, &bb, &c, &d) == 4) {
memset(b, 0, sizeof(b));
fac(a, 1);
fac(bb, -1);
fac(a-bb, -1);
fac(c, -1);
fac(d, 1);
fac(c-d, 1);
double ans = 1; // 将分解后的还原
for(int i=0; i<ind; i++) {
// ans *= pow(prime[i]*1.0,b[i]);
if(b[i]>0) {
for(int j=0; j<b[i]; j++) ans *= prime[i];
} else {
for(int j=0; j<-b[i]; j++) ans /= prime[i];
}
}
printf("%.5lf\n", ans);
}
return 0;
}