我們已知n和k。
那麼能得到一些資訊:
每一輪之後,剩下的人是n - n / k。
最後剩下k個人的時候,殺掉最後第k個人之後遊戲結束。
那麼在最後k個人中,最後乙個人當前編號為k,我們要求的是他在上一輪的編號是多少,如果能求出,那麼一直求到開始狀態就能知道答案。
設當前編號為t,上一輪他的編號為x。需要找到t和x的關係。那麼我們很容易列出乙個表示式:t=x - x / k。但是可以發現, 這個式子是錯的,當x整除k的時候,最後乙個人被殺掉,那麼也就沒有t了。所以我們先去掉最後乙個x,那麼下一輪剩下的人是(x - 1) - (x - 1) / k + 1。所以得到t - 1=(x - 1) - (x - 1) / k。
化簡得到x = (t * k - 1) / (k - 1),t * k可能會溢位。
所以再化簡x = t + (t - 1) / (k - 1)。完畢。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
const
int inf=1e9+7;
typedef pair pii;
typedef
long
long ll;
int dfs(int n,int k)
int main()
return
0;}
2 2 1 殘缺棋盤
殘缺棋盤 defective chessboard 是乙個有2k 2k 個方格的棋盤,其中恰有乙個方格殘缺。圖2 3給出k 2時各種可能的殘缺棋盤,其中殘缺的方格用陰影表示。注意當k 0時,僅存在一種可能的殘缺棋盤 如圖1 4 3 a所示 事實上,對於任意k,恰好存在22k 種不同的殘缺棋盤。殘缺棋...
2 21 大整數排序
題目描述 對n個長度最長可達到1000的數進行排序。輸入描述 輸入第一行為乙個整數n,1 n 100 接下來的n行每行有乙個數,數的長度範圍為1 len 1000。每個數都是乙個正數,並且保證不包含字首零。輸出描述 可能有多組測試資料,對於每組資料,將給出的n個數從小到大進行排序,輸出排序後的結果,...
USACO2 2 1 序言頁碼
這題還是挺有意思的 但是會發現,其實每一位的情況都是一樣的,只需要考慮個位的0,1,2,3,4,5,6,7,8,9的情況下,1,5,10的使用情況。然後在兩位數的時候,十位的情況其實和個位一樣,只不過類推到10 50 100的使用上而已。兩位數的個位,依然和個位數的個位情況完全一樣。所以這道題就成了...