[原创]LightOJ 1035 Intelligent Factorial Factorization [预处理+一半的 质因子分解]【数论】

2016-06-29 16:32:35 Tabris_ 阅读数:305


博客爬取于2020-06-14 22:44:18
以下为正文

版权声明:本文为Tabris原创文章,未经博主允许不得私自转载。
https://blog.csdn.net/qq_33184171/article/details/51783994


题目链接:LightOJ 1035 Intelligent Factorial Factorization


Intelligent Factorial Factorization
Time Limit:500MS Memory Limit:32768KB 64bit IO Format:%lld & %llu
Submit

Status
Description
Given an integer N, you have to prime factorize N! (factorial N).

Input
Input starts with an integer T (≤ 125), denoting the number of test cases.

Each case contains an integer N (2 ≤ N ≤ 100).

Output
For each case, print the case number and the factorization of the factorial in the following format as given in samples.

Case x: N = p1 (power of p1) * p2 (power of p2) * …

Here x is the case number, p1, p2 … are primes in ascending order.

Sample Input
3
2
3
6
Sample Output
Case 1: 2 = 2 (1)
Case 2: 3 = 2 (1) * 3 (1)
Case 3: 6 = 2 (4) * 3 (2) * 5 (1)


题目大意 就是把N! 质因子分解一下

题解: 因为数据量很小 所以预处理一下所有N! 的质因子个数即可

这种办法 应该可以做到n<=1000
n<10000的时候用容器存一下 而且时间在大一丢丢 应该还是能做的

因为数据量太小 所有算法都是最最最最最暴力的

附本题代码


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
# include <limits.h>
# include <malloc.h>
# include <ctype.h>
# include <math.h>
# include <string>
# include <iostream>
# include <algorithm>
# include <map>
# include <vector>
# include <set>

using namespace std;

# define LL unsigned long long int

int Is_or[500];
void Prime()
{
int n=200;
int k=0;
memset(Is_or,1,sizeof(Is_or));
Is_or[0]=Is_or[1]=0;
for(int i=2; i<n; i++)
{
if(Is_or[i])
{
for(int j=i+i; j<n; j+=i)
{
Is_or[j]=0;
}
}
}
return ;
}

int has[105][105];

void init()
{
int num;
memset(has,0,sizeof(has));
for(int i=2;i<=100;i++)
{
for(int j=2;j<=i;j++)
{
num=i;
if(num%j==0&&Is_or[j])
while(num%j==0)
has[i][j]++,num/=j;
}
}

for(int i=1;i<=100;i++)
{
for(int j=1;j<=100;j++)
{
has[i][j]+=has[i-1][j];
}
}

return ;
}

int main()
{
Prime();
init();
int t,tt=0,num;
LL p,l;
scanf("%d",&t);
while(t--)
{
int n,m;
scanf("%d",&n);
printf("Case %d: %d = ",++tt,n);

printf("%d (%d)",2,has[n][2]);
for(int i=3;i<=n;i++)
{
if(has[n][i])
printf(" * %d (%d)",i,has[n][i]);
}
printf("\n");
}
return 0;
}