URAL 1355. Bald Spot Revisited(数论)

题目链接

题意 : 一个学生梦到自己在一条有很多酒吧的街上散步。他可以在每个酒吧喝一杯酒。所有的酒吧有一个正整数编号,这个人可以从n号酒吧走到编号能整除n的酒吧。现在他要从a号酒吧走到b号,请问最多能喝到多少酒。

思路 :因为b肯定要是a的倍数,是a从头开始乘下去的,实际上就是找构成b/a的素数划分,有多少个素数划分就可以喝到多少的酒。

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <iostream>
 4 
 5 using namespace std ;
 6 
 7 int sumnum(int n)
 8 {
 9     for(int i = 2 ; i * i <= n ; i++)//素数
10     {
11         if(n % i == 0){//为0就说明多了一个,然后剩下的数接着找
12             return 1 + sumnum(n / i) ;
13         }
14     }
15     return 0 ;
16 }
17 int main()
18 {
19     int T ;
20     scanf("%d",&T) ;
21     int a,b ;
22     while(T--)
23     {
24         scanf("%d %d",&a,&b) ;
25         if(b % a != 0)
26         {
27             printf("0
") ;
28             continue ;
29         }
30         else if(a == b)
31         {
32             printf("1
") ;
33             continue ;
34         }
35         int ans = sumnum(b / a);
36         printf("%d
",ans+2) ;//加上a和b
37     }
38     return 0 ;
39 }
View Code
原文地址:https://www.cnblogs.com/luyingfeng/p/4067636.html