POJ 3372 Candy Distribution 完全剩餘系/奇偶性

來源:互聯網
上載者:User

題意:老師給N個學生髮糖,第x次發糖發給編號為 f(x) 的學生。可以推知:f(x) = x * (x+1) / 2 % N(學生號為 0, 1, 2, 3, ```N-1 )

現在問你是否每個學生都能得到至少一顆糖。

題解:要使每個學生都至少得到一顆糖,那麼f(x) 應該構成模N的完全剩餘系。

那麼這個問題的反面就是在什麼情況下,f(x) 不能構成模N的完全剩餘系。

我們知道若存在 x != y, 使得 f(x) = f(y),那麼f(x)邊不能構成模N的完全剩餘系。

若f(x)  = f(y), 推出 x * (x+1) / 2 % N = y * (y+1) / 2 % N,  推出 (x+y+1)(x-y) / 2 = 0 % N

這樣可以假設 N^t = (x+y+1)(x-y)/2,於是這個等式成立的條件便是f(x) = f(y)成立的條件。

下面我們具體分析:

首先給出兩個顯而易見的結論:

(1).任意一個偶數都可以表示成 b * 2^e 的形式(b為奇數)

(2).(x+y+1)與(x-y)中必定一個是偶數一個是奇數

假如 N^t = (x+y+1)(x-y)/2

1.若N是奇數,那麼N^t 還是奇數,於是我們一定可以找到適當的x,y,t使得 (x+y+1)(x-y)/2 = N^t,例如令 x = y + 2, 得 y + 3 = N^t,

得 y = N^t - 3。 所以在這種情況下f(x)  = f(y),不能構成完全剩餘系。

2.若N是2的冪,令N=2^e,  那麼N^t = 2^(e*t) 為偶數,而(x+y+1)(x-y)/2是奇數,顯然不可能存在x,y,t使得 N^t = (x+y+1)(x-y)/2。所以在這種情況下f(x)
 != f(y) 可以構成完全剩餘系。

3.若N是形如 b * 2^e 的偶數,那麼 N^t = b^t * 2^(e*t)。 

令(x+y+1) = b^t, (x-y)/2 = 2^(e*t)

即(x+y+1) = b^t     //一式

    (x-y) = 2^(e*t+1)   //二式

解一式二式構成的方程組,得到 2x =
2^(e*t+1) + b^t - 1,左右均為偶數,顯然x是有解的,那麼y也是有解的。所以在這種情況下f(x)  = f(y),不能構成完全剩餘系。

注意上面的式子並不是一般的式子,我們只是用它們來判斷存在性,由 N^t = (x+y+1)(x-y)/2這一假設引出的,是由結果到原因的推導,並不能隨意的求解。例如 2x
= 2^(e*t+1) + b^t - 1,假如一邊是奇數,一邊是偶數,那麼x顯然是無解的。

#include<cstdio>int main(){    int n;    while ( scanf("%d",&n) != EOF )    {        if ( n & ( n - 1 )) printf("NO\n"); //這個方式判斷n是否是2的冪,還是蠻巧妙的。        else printf("YES\n");    }    return 0;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.