好多的树
时间限制:3000 ms | 内存限制:65535 KB
难度:5
描述
在那遥远的地方有一片神奇的森林,它的神奇之处是:森林中的每棵树都长在一对整数确定的坐标上。有一个小红人站在(0,0)的位置上,放眼望去,看到很多的树,眼前的树是那么的多,以至于它一直数不清。那么就来写个程序帮它数数吧!
输入
第一行一个整数n,代表测试数据组数。
接下来有n(n<=20)行数,每行数有两个整数i,j代表任何的(x,y)(0
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
const int MAXN = 100000 + 5;
bool isUsed[MAXN];
vector<int> prime[MAXN];
void init() //取得每个数的质因数。
{
memset(isUsed, false, sizeof(isUsed));
for (int i = 0; i < MAXN; i++) {
prime[i].clear();
}
for (int i = 2; i < MAXN; i++) {
if (!isUsed[i]) {
prime[i].push_back(i); //如果这个数是素数那么它本身也是他的质因数
for (int j = i+i; j < MAXN; j += i) {
prime[j].push_back(i); //j表示这个数,i表示质因数
isUsed[j] = true;
}
}
}
}
long long dfs(int row, int x, int col)
{
long long ret = 0;
for (int i = col; i < prime[row].size(); i++) {
ret += x/prime[row][i] - dfs(row, x/prime[row][i], i+1);
}
return ret;
}
int main()
{
init();
// for (int i = 2; i <= 100; i++) {
// printf("i -> %d:", i);
// for (int j = 0; j < prime[i].size(); j++) {
// printf(" %d", prime[i][j]);
// }
// printf("\n");
// }
int t, x, y;
cin >> t;
while (t--) {
cin >> x >> y;
if (x < y) {
int z = x; x = y; y = z;
}
long long treeCnt = x;
for (int i = 2; i <= y; i++) {
treeCnt += x - dfs(i, x, 0);
}
cout << treeCnt << endl;
}
return 0;
}