uva 10139 求n的阶乘能否整除m
2015-08-13 11:20
447 查看
n跟m的范围都是0-2^31,只能用质因数分解把m分成若干个质数相乘的形式,然后对每个质因数的数量判断n的阶乘中这个质因数的数量是不是足够,不够的话就不行。
最后m可能是一个质数,没有被2到根号m中的质数分解,于是分解过后要是m还要大于n,这也不能分解,但是当n==0,m==1时是可以的,这种情况要特判。
最后m可能是一个质数,没有被2到根号m中的质数分解,于是分解过后要是m还要大于n,这也不能分解,但是当n==0,m==1时是可以的,这种情况要特判。
#include<bitset> #include<map> #include<vector> #include<cstdio> #include<iostream> #include<cstring> #include<string> #include<algorithm> #include<cmath> #include<stack> #include<queue> #include<set> #define inf 0x3f3f3f3f #define mem(a,x) memset(a,x,sizeof(a)) using namespace std; typedef long long ll; typedef pair<int,int> pii; inline int in() { int res=0; char c; while((c=getchar())<'0' || c>'9'); while(c>='0' && c<='9')res=res*10+c-'0',c=getchar(); return res; } const int N=500000; bitset <N>vis; int prime[200000]; int getNum(int i,int m) { int res=0; while(m) { res+=m/prime[i]; m/=prime[i]; } return res; } int main() { int p=-1; for(int i=2;i<N;i++) { if(!vis[i]) prime[++p]=i; for(int j=0;j<=p && prime[j]*i<N;j++) { vis[prime[j]*i]=1; if(i%prime[j]==0)break; } } int n,m; while(~scanf("%d%d",&n,&m)) { if(n>=m) { printf("%d divides %d!\n",m,n); continue; } bool can=1; int record=m; for(int i=0;i<=p && can && prime[i]*prime[i]<=m;i++) { int tmp=0; while(m%prime[i]==0)//质因数分解 { tmp++; //当前质因数的个数 m/=prime[i]; } if(tmp){ int tmp2=getNum(i,n); //n!中prime[i]的个数 if(tmp2<tmp) can=0; } } if(n!=0 && m>n)can=0;/// if(can) printf("%d divides %d!\n",record,n); else printf("%d does not divide %d!\n",record,n); } return 0; }
相关文章推荐
- Android FragmentManage FragmentTransaction介绍(一)
- rsync 文件同步
- 轻量级java ee 中的相关技术概述
- 为Elasticsearch添加中文分词,对比分词器效果
- group by与having的使用方法
- [转载]请教各位高手光盘版或者U盘版的BT保存配置的问题
- 前端页面中iOS版微信长按识别二维码的bug与解决方案
- 关于研究UIautomator操作手机执行case
- android RecyclerView 使用完全解析
- JS使用userAgent判断操作系统和浏览器类型
- 一个有趣的程序,java的引用传参。
- MySQL逗号分割字段的行列转换技巧
- K60 FlexCAN 清中断标志的一个问题
- 深入详解javascript之delete操作符
- 8年,属于 HTML 5 春天的到来悄悄!
- eclipse学习
- 算法:求 Huffuman树 构造费用
- OPEN(SAP) UI5 学习入门系列之二: 最佳实践练习(上)
- 使用Hibernate SQLQuery执行原生SQL
- Java多线程——<八>多线程其他概念