HDU2211 殺人遊戲 數學

2021-07-09 21:57:25 字數 997 閱讀 2058

我們已知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的使用上而已。兩位數的個位,依然和個位數的個位情況完全一樣。所以這道題就成了...