目錄
- 題目背景
- 題目描述
- 輸入格式
- 輸出格式
- 測試樣例
- 樣例說明
- 數據范圍
- 思路
- 核心代碼
題目背景
這是小橘。因為它總是看起來很高傲,所以人送外號“高昂的貓”。
題目描述
"錒狗"的房間里放著 n n n ( 1 ≤ n ≤ 1 0 9 ) (1 \leq n \leq 10^9) (1≤n≤109)個貓糧罐頭。它們從左到右排成一列,上面寫有編號,分別為從 1 1 1到 n n n的正整數。
"小橘"是一只貪吃的貓,每天它都會從左往右巡視一遍這些罐頭,并且從中吃掉一些。
每天在巡視罐頭的時候,小橘都會將它在最左側遇到的第 1 1 1個罐頭吃掉,然后每間隔 2 2 2個罐頭吃掉 1 1 1個罐頭。
錒狗想知道,這些罐頭一共能供小橘這只肥貓吃幾天?而編號為 x x x ( 1 ≤ x ≤ n ) (1 \leq x \leq n) (1≤x≤n)的超級大罐頭將會在第幾天被吃掉?請你幫他解決這兩個問題。
輸入格式
輸入僅一行,包含兩個用空格分隔開的正整數 n 、 x n、x n、x,分別表示貓糧罐頭的總數和超級大罐頭的編號。
輸出格式
輸出僅一行,包含兩個正整數。兩個數之間由一個英文空格隔開,分別表示小橘吃完所有罐頭所需的天數,以及吃掉編號為 x x x的罐頭是在第幾天。
測試樣例
8 6
5 2
樣例說明
錒狗的房間里一共放了 8 8 8個貓糧罐頭。
小橘第 1 1 1天吃掉了編號為 1 、 4 、 7 1、4、7 1、4、7的罐頭。
小橘第 2 2 2天吃掉了編號為 2 、 6 2、6 2、6的罐頭,其中包括編號為 6 6 6的超級大罐頭。
小橘第 3 3 3天吃掉了編號為 3 3 3的罐頭。
小橘第 4 4 4天吃掉了編號為 5 5 5的罐頭。
小橘第 5 5 5天吃掉了編號為 8 8 8的罐頭。
數據范圍
1 ≤ n ≤ 1 0 9 1 \leq n \leq 10^9 1≤n≤109
1 ≤ x ≤ n 1 \leq x \leq n 1≤x≤n
思路
這個題目詢問了兩個問題,第一個是罐頭一共能吃幾天,還有一個是編號為 x x x的罐頭是第幾天吃掉的,首先我們來看第一個問題:
假設有罐頭編號分別為:
1、2、3、4、5、6、7、8、9、10
第一天:1 、2、3、4、5、6、7、8、9、10
第二天:2、3、5、6、8、9
第三天:3、5、8、9
第四天:5、8
第五天:8
加入對每一天進行重新編碼:
第一天:1 、2、3、4、5、6、7、8、9、10
第二天:1 、2、3、4、5、6
第三天:1 、2、3、4
第四天:1 、2
第五天:1
我們可以發現:對于重新編碼的數字,每一天都是吃掉除以上余1的數字,根據這個我們可以更新每一天吃掉了多少個罐頭推理出剩下的罐頭數量,然后又可以繼續推理出下一次的情況,一直到沒有罐頭
對于第二個問題:我們可以推理編號 x x x是當前第幾個數字,如果是除以三余1的數那么就是被吃掉的日子。
核心代碼
#include <bits/stdc++.h>
#define debug(x) cout<<#x<<" = "<<x<<"\n"
using namespace std;
typedef long long LL;int main() {int n,x;cin>>n>>x;int a=0,b=0;while(n>0){n-=(n+2)/3;a++;}while(x>0){b++;if(x%3==1)break;x-=(x+2)/3;}cout<<a<<" "<<b;return 0;
}