題目大意:
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
*/