南阳nyoj 509 因子和阶乘
因子和阶乘
时间限制:1000 ms | 内存限制:65535 KB
难度:2
- 描述
- 给你一个正整数n,把n!=1x2x3x.....xn分解成素因子相乘的形式,并从小到大输出每个素因子的指数,但要保证最后输出的素因子个数不为0。例如825应表示为0,1,2,0,1表示分别有0,1,2,0,1个2,3,5,7,11。
- 输入
- 第一行有一个整数n(0<n<10000),表示有n组测试数据;
接下来n行每行有一个整数 m(1<m<10000) - 输出
- 从小到大输出m分解成素因子相乘后各个素因子对应的指数
- 样例输入
-
2 5 53
- 样例输出
-
3 1 1
49 23 12 8 4 4 3 2 2 1 1 1 1 1 1 1
做这一题是,不知道如何处理这个N!,如果可以转化成整数,那可以用以前的知识解决了。但是
N很大的时候,就不行了。
理论依据:
也可以写成
num=[N/pi^1]+ [N/pi^2]+ …… + [N/pi^n] 其中[]为取整
求N!有几个要注意的地方。
1.最大的质因子不会超过N,
2.关于公式的转化:
式子中把一些东西看成一个整体。举例:
num=N/pi^1+N/pi^2+N/pi^3;
==>
N/p1^1+(N/p1^1)/p1^1+((N/p1^1)/p1^1)/p1^1;
这样的话就可以写成一个solve函数。1 #include<iostream> 2 #include<cstdio> 3 #include<cstdlib> 4 #include<cstring> 5 using namespace std; 6 7 8 bool s[10003]; 9 int prime[10003],len; 10 int Flag; 11 12 void make_prime()//素数获取 13 { 14 int i,j; 15 len=0; 16 for(i=2;i<=10000;i++) 17 if(s[i]==false) 18 { 19 prime[++len]=i; 20 for(j=i*2;j<=10000;j=j+i) 21 s[j]=true; 22 } 23 } 24 25 void solve(int n,int m)//num=[N/pi^1]+ [N/pi^2]+ …… + [N/pi^n] 26 { 27 int i,k=0; 28 while(n) 29 { 30 n=n/m; 31 k=k+n; 32 } 33 if(Flag==0) 34 { 35 printf("%d",k); 36 Flag=1; 37 } 38 else printf(" %d",k); 39 } 40 41 int main() 42 { 43 int T,n,i; 44 make_prime(); 45 while(scanf("%d",&T)>0) 46 { 47 while(T--) 48 { 49 scanf("%d",&n); 50 Flag=0; 51 for(i=1;prime[i]<=n;i++) 52 solve(n,prime[i]); 53 printf("\n"); 54 } 55 } 56 return 0; 57 }