ural 1355
题目:http://acm.timus.ru/problem.aspx?space=1&num=1355
题意:给出两个数 a b,从a 可以走的编号是 b 的因子,每走一个编号就可以喝一杯酒,问从 a 到 b 可以喝到最多的酒是多少(大概是这个意思)
思路:如果从a 到不了 b(即 b % a 不为零) 那么 ans = 0;如果可以走到,那么计算 b / a 后的素因子的个数
View Code
1 typedef long long ll; 2 const int N = 32000; 3 int prime[N]; 4 bool vis[N]; 5 int num; 6 void is_prime() 7 { 8 int i,j; 9 for(i = 2; i < N; i++) 10 if(!vis[i]) 11 { 12 prime[num ++] = i; 13 for(j = 2; j * i < N; j++) 14 { 15 if(vis[i * j]) continue; 16 vis[i * j] = true; 17 } 18 } 19 } 20 int main() 21 { 22 num = 0; 23 is_prime(); 24 int t; 25 int i,j; 26 int a,b; 27 //freopen("data.txt","r",stdin); 28 scanf("%d",&t); 29 while(t--) 30 { 31 scanf("%d%d",&a,&b); 32 if(b % a) {printf("0\n");continue;} 33 int tem = sqrt(b * 1.0); 34 b /= a; 35 int ans = 1; 36 for(i = 0; i < num && i <= tem; i++) 37 { 38 while(b % prime[i] == 0) 39 { 40 ans ++; 41 b /= prime[i]; 42 } 43 } 44 if(b != 1) ans ++; 45 printf("%d\n",ans); 46 } 47 return 0; 48 }