#include <cstdio>
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct node{
int x, y;
node(int _x = 0, int _y = 0):x(_x), y(_y){}
};
const int M = 120100;
vector<int>buf;
vector<node>v;
int m;
bool fact(int m){
for(int i = 3; i*i <= m+1; i += 2 )if(m%i == 0)return false;
return true;
}
void dfs(int pos, int index, int cnt){
if(index == m)return;
if(buf[index] >= M/pos) return;//此处乘法会超int,注意
int s = pos*buf[index];
v.push_back(node(s, cnt));
dfs(s, index+1, cnt+1);
dfs(pos, index+1, cnt);
}
int main()
{
int t, n;
buf.push_back(2);
for(int i = 3; i < M; i+=2)
if(fact(i))buf.push_back(i);
m = buf.size();
dfs(1, 0, 1);
cin >> t;
while(t--){
long long x, y, ans = 0;
cin >> x >> y;
m = v.size();
for(int i = 0; i < m; i++){
if(v[i].y & 1) ans += (x/v[i].x)*(y/v[i].x);
else ans -= (x/v[i].x)*(y/v[i].x);
}
ans = x*y - ans;
cout << ans << endl;
}
return 0;
}
/*
这道题明显就是求互质数对的个数
可以用容斥求不互质数对的个数
比如a和b不互质,一定有一个约数
比如约数是2,或者3,或者6。。。。
自己用容斥搞吧
*/
HDU 2841 Visible Trees (容斥原理)
最新推荐文章于 2018-09-27 20:53:00 发布