大意:求出;两个数n,m中,(有定理一个数可以分为若干个素数的乘积的形式),指数的个数和差值。
思路:直接素数筛,并且把指数记录下来。
#include <iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define L __int64
using namespace std;
const int inf=0x3f3f3f3f;
int prim[1000100],nu1[100000],nu2[100000],cnt;
bool vis[1000100];
void ini(){
cnt=0;
memset(vis,false,sizeof(vis));
int i,j;
for(i = 2;i < 1000010;++i){
if(!vis[i])
prim[cnt++] = i;
for(j = 0;j < cnt&&prim[j]*i<1000010;++j){
vis[prim[j]*i ] = true;
if(i%prim[j] == 0)
break;
}
}
}
void solve1(int x){
int tmp=0;
while(x!=1){
while(x%prim[tmp]==0){
x/=prim[tmp];
nu1[tmp ]++;
}
++tmp;
}
}
void solve2(int x){
int tmp=0;
while(x!=1){
while(x%prim[tmp]==0){
x/=prim[tmp];
nu2[tmp ]++;
}
++tmp;
}
}
int main(){
int n,m,i,j,k,cla=1,ans;
ini();
while(~scanf("%d%d",&n,&m)){
if(n==0&&m==0)
break;
memset(nu1,0,sizeof(nu1));
memset(nu2,0,sizeof(nu2));
solve1(n);
solve2(m);
int t=0;
ans=0;
for(i=0;i<cnt;++i){
if(nu1[i]||nu2[i]){
++t;
ans+=abs(nu1[i]-nu2[i]);
}
}
printf("%d. %d:%d\n",cla++,t,ans);
}
return 0;
}
本文介绍了通过素数筛法解决求解两个数n和m的素数分解指数个数和差值的方法。
1009

被折叠的 条评论
为什么被折叠?



