SOJ 2666 分解n!
来源:互联网 发布:大数据顶尖企业 编辑:程序博客网 时间:2024/05/20 04:48
题目连接:http://zuojie.3322.org:88/soj/problem.action?id=2666
Description
给你一个数 n (1 < n <= 1000000) ,求 n! (n的阶乘)的质因数分解形式,质因数分解形式为n=p1^m1*p2^m2*p3^m3……* 这里 p1 < p2 < p3 < …… 为质数* 如果 mi = 1, 则 ^ mi 就不需要输出Input
输入是多case的,每行一个数n,1 < n <= 1000000,当n等于0时输入结束Output
每个n输出一行,为它的质因数分解形式Sample Input
670Sample Output
6=2^4*3^2*57=2^4*3^2*5*7Author
windy7926778
题目是windy教主出的,意在考察对质因数分解和阶乘的深入理解。
如果按照普通思维,分别从1分解到n的话,超时的可能性非常大,而且内存开销也极其庞大。
必须转换思维。直接从n下手。
举个例子
n!里面包含了多少个2,假设n=10
那么个数是:10/2+10/4+10/8=5+2+1
于是快速方法就得到了
我们这样就可以直接统计每一个素因子出现了多少次,而1000000以内的素因子个数总共只有7w多,也就是说O(n)的速度是可行的!
我的代码:
#include<stdio.h>#include<string.h>#define MAXN 1000000typedef long long LL;bool flag[MAXN+1];int prime[MAXN+1];int ans[MAXN+1];int MAX,num=0;void init(){LL i,j;for(i=2;i<=MAXN;i++){if(!flag[i]){prime[num++]=(int)i;for(j=i*i;j<=MAXN;j=j+i)flag[j]=true;}}}void solve(int n){int i,N;for(i=0;prime[i]<=n&&i<num;i++){N=n;while(N){ans[i]=ans[i]+N/prime[i];N=N/prime[i];}}printf("%d=",n);if(ans[0]==1)printf("2");else if(ans[0]>1)printf("2^%d",ans[0]);for(i=1;prime[i]<=n&&i<num;i++){if(ans[i]==1)printf("*%d",prime[i]);else if(ans[i]>1)printf("*%d^%d",prime[i],ans[i]);}printf("\n");}int main(){int n;init();while(scanf("%d",&n)!=EOF){if(n==0)break;memset(ans,0,sizeof(ans));solve(n);}return 0;}
- SOJ 2666 分解n!
- 分解 n!
- SOJ 2668 C(n,k) 数论
- 1484 分解N阶乘
- n! 素因子分解
- n!分解质因数、因数
- n!素因子分解
- n!的标准分解
- PythonTip 分解n!
- soj
- n!的素因子分解
- n!的质因子分解
- POJ1401 数学N!因子分解
- n!的素因子分解
- N!的素因子分解
- n!素因子分解2
- n阶乘的素数分解
- N!的质因子分解
- android:SQLite3命令行使用查询android的telephone数据库
- _RecordsetPtr的open与_CommandPtr 的Execute区别
- GAE安装时注意MyEclipse的版本
- 右键新建菜单中没有“文本文档”的解决方法 (zt)
- C#调用c++Dll结构体数组指针的问题
- SOJ 2666 分解n!
- 《深入理解计算机系统》(第二版)第二章练习题4
- (转)Combobox 输入的关键字模糊下拉出相应的内容
- 【转】makefile 获取指定目录下源文件名称
- 持续集成(1)--配置maven使用nexus
- 我是残疾人--我近视
- 面试题——跑马灯
- 软件工程师与商人的区别
- 快速排序,冒泡排序,插入排序 完整示例