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 }