Visible Trees HDU - 2841

原题链接

考察:容斥原理

思路:

       这道题就是 GCD HDU - 1695  的弱化版.把这道题翻译一下就是在(1,a)区间有多少个与(1,b)区间的数gcd=1

       想出这个就可以解决了,如果a b都声明int型,相乘的时候我们不要忘记转化long long

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <cstdio>
 4 #include <vector>
 5 using namespace std;
 6 typedef long long ll;
 7 const int N = 100010;
 8 vector<int> v[N];
 9 bool st[N];
10 void GetPrime(int n)
11 {
12     for(int i=2;i<=n;i++)
13     {
14         if(st[i]) continue;
15         v[i].push_back(i);
16         for(int j=2*i;j<=n;j+=i)
17         {
18             v[j].push_back(i);
19             st[j] = 1;
20         }
21     }
22 }
23 int main()
24 {
25     GetPrime(N-5);
26     int T;
27     scanf("%d",&T);
28     while(T--)
29     {
30         int a,b; scanf("%d%d",&a,&b);
31         if(a>b) swap(a,b);
32         ll ans = (ll)a*b;
33         for(int i=2;i<=b;i++)
34         {
35             int sz = v[i].size();
36             for(int j=1;j<1<<sz;j++)
37             {
38                 ll res = 1; int cnt = 0;
39                 for(int k=0;k<sz;k++)
40                 {
41                     if(j>>k&1)
42                     {
43                         if(res*v[i][k]>a)
44                         {
45                             res = -1;
46                             break;
47                         }
48                         res*=v[i][k],cnt++;
49                     }
50                 }
51                 if(res!=-1)
52                 {
53                     if(cnt&1) ans-=a/res;
54                     else ans+=a/res;
55                 }
56             }
57         }
58         printf("%lld\n",ans);
59     }
60     return 0;
61 }

 

 

posted @ 2021-01-31 15:01  acmloser  阅读(70)  评论(0编辑  收藏  举报