首页 > 代码库 > uva10780(分解质因数)
uva10780(分解质因数)
可以直接用高精度来暴力求。
也可以不用高精度:
把m分解质因数,记录每个因数和它的次数。然后计算每个因数在n的阶乘里出现了多少次,再把这个次数除以它在m中的次数,就是可能的k值。取最小的k。
#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<cmath>#include<map>#include<set>#include<vector>#include<algorithm>#include<stack>#include<queue>using namespace std;#define INF 1000000000#define eps 1e-8#define pii pair<int,int>#define LL long long intint m,n,k,T;int prime[5005],vis[5005];void getprime(){ int num=0; for(int i=2;i<5000;i++) { if(vis[i]==0) prime[num++]=i; for(int j=i*i;j<5000;j+=i) { if(j%i==0) vis[j]=1; } }}int main(){ //freopen("in6.txt","r",stdin); //freopen("out.txt","w",stdout); getprime(); scanf("%d",&T); for(int cas=1;cas<=T;cas++) { scanf("%d%d",&m,&n); k=INF; vector<pii>zhi; for(int i=0;prime[i]<=m;i++) { int num=0; while(m%prime[i]==0) { num++; m/=prime[i]; } if(num) zhi.push_back(make_pair(prime[i],num)); } for(unsigned int i=0;i<zhi.size();i++) { int t=zhi[i].first,num=0; for(int j=n;j>=1;j--) { int jj=j; while(jj%t==0) { num++; jj/=t; } } //cout<<‘k‘<<num<<endl; k=min(k,num/(zhi[i].second)); } printf("Case %d:\n",cas); if(k) printf("%d\n",k); else printf("Impossible to divide\n"); } //fclose(stdin); //fclose(stdout); return 0;}
uva10780(分解质因数)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。