您的位置:首页 > 大数据 > 人工智能

Uva10780 Again Prime? No Time.

2013-08-05 22:14 417 查看
这题搞了1个多小时= =!靠着UVA的BBS上的数据才过的 思路是:把m质因数分解,各质因数的系数用map(a)记录,把1到n的数都质因数分解,用map(b)记录(累加),然后逐一遍历,碰到a[i]=0则跳过,碰到b[i] = 0& a[i]!= 0 则无解,接下来就是我无法理解地方了,判断前两种情况之后,如果碰到b[i] 无法整除a[i] 的时候,理应是无解,但是我只要这样判 就是WA,如果不判,就是AC。。。希望大神能够赐教
#include <iostream>
#include <cstdio>
#include <map>
#include <cmath>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 10000 + 10;
const int maxp = 7000;
bool vis[maxn];
int prime[maxp];
int num;
void sieve(int n){
int m = (int)sqrt(n+0.5);
memset(vis,0,sizeof(vis));
for(int i = 2; i <= m; i++) if(!vis[i]){
for(int j = i*i; j <= n; j+= i) vis[j] = 1;
}
}
int gen_prime(int n){
sieve(n);
int c = 0;
for(int i = 2; i <= n; i++) if(!vis[i]){
prime[c++] = i;
//cout<<i<<"@@@"<<endl;
}
return c;
}
void factor(int n,map<int,int> &k){
int tmp,i,now;
tmp = (int)((double)sqrt(n)+1);
now = n;
for(i = 2; i <= tmp; i++)if(now %i==0){
while(now%i==0){
++k[i];
now/=i;
}
}
if(now != 1){
k[now]++;
}
}
int main(){

int ncase,T=1;
cin >> ncase;
map<int,int> a,b;
while(ncase--){
int m,n;
a.clear();
b.clear();
scanf("%d%d",&m,&n);
//cout<<m<<" "<<n <<endl;
num = gen_prime(m);
factor(m,a);
for(int i = 1; i <= n; i++){
factor(i,b);
}
int ans = 100000000;
bool flag = 0;
for(int i = 0; i < num; i++){
if(a[prime[i]] == 0){
continue;
}
else if(b[prime[i]]==0){
flag = 1;
//cout<<"@@@"<<endl;
break;
}
else{
ans = min(ans,b[prime[i]]/a[prime[i]]);
}
//这一段完全搞不懂??!!!
/*else if(b[prime[i]]%a[prime[i]] == 0){
ans = min(ans,b[prime[i]]/a[prime[i]]);
}
if(b[prime[i]]%a[prime[i]] != 0){
flag = 1;
cout<<b[prime[i]]<<" "<<a[prime[i]]<<" "<<prime[i]<<endl;
cout<<"!!!!"<<endl;
break;
}*/
}
if(flag){
printf("Case %d:\nImpossible to divide\n",T++);

}else{
printf("Case %d:\n%d\n",T++,ans);
}

//cout<<ans<<endl;
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: