RoundE——street checkers 學習代碼*2

題目大意:
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
*/
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章