题目大意:
Alice和Bob玩一款AR游戏,在一个很长的街道上,这个街道上的砖块编号0~10^9。游戏开始时,Alice和Bob都站在第0块砖上,给定一个数字X在[L,R]的范围内,Alice仅跳到奇数编号上,Bob仅跳到偶数编号上。如果他们跳到的编号能够整除X,则他们则将这块砖涂上自己最喜欢的颜色,当其中一人跳到了第X块砖上时,游戏结束。
当Alice和Bob各自涂色的砖块数量差不超过2时,则表示这个游戏是有趣的。找出[L,R]区间内有多少种X的取值方案使得游戏是有趣的。
输入:第一行输入一个整数T,表示有T个测试用例。接下来T行包含两个整数L和R, 用于生成随机数X。
输出:对于每个测试用例,输出Case #x: y, 表示第x个测试用例,y表示[L,R]区间内有多少种取值方式能使得游戏是有趣的。
用例解释:
解题:
即:找出[L,R]区间内的数字N,可以整除N的奇数和可以整除N的偶数个数不超过2。
进行预处理,计算每个数字奇数和偶数除数个数。
#include <iostream>
#include <vector>
#include <cstring>
#include <cmath>
using namespace std;
const int MAXN = 1000006;
const int SMALLN = 1000000;
int odd[MAXN], even[MAXN];
void init()
{
memset(odd,0,sizeof(odd));
memset(even,0,sizeof(even));
for (int i = 1; i <= SMALLN; i++)
{//计算每个数字除数个数
for (int j = i; j <= SMALLN; j+=i)
{
if (i%2) odd[j]++; //数字j偶数除数个数
else even[j]++; //数字j奇数除数个数
}
}
}
void solve(int case_no)
{
int L, R;
cin >> L >> R;
int ans = 0;
for (int i = L; i <= R; i++)
{
//cout << i << " " << odd[i] << " " << even[i] << endl;
if (abs(odd[i] - even[i]) <= 2) ans++;
}
cout << "Case #" << case_no << ": ";
cout << ans;
cout << endl;
}
int main()
{
init();
int case_number;
cin >> case_number;
for (int cur_case_no = 1; cur_case_no <= case_number; cur_case_no++)
{
solve(cur_case_no);
}
}
/*
2
5 10
102 102
*/