2015百度之星資格賽1001

2021-07-02 20:28:03 字數 1344 閱讀 9890

題目名稱:大搬家

problem description

近期b廠組織了一次大搬家,所有人都要按照指示換到指定的座位上。指示的內容是坐在位置

i 上的人要搬到位置

j 上。現在b廠有

n 個人,一對一到

n 個位置上。搬家之後也是一一對應的,改變的只有位次。

在第一次搬家後,度度熊由於疏忽,又要求大家按照原指示進行了一次搬家。於是,機智的它想到:再按這個指示搬一次家不就可以恢復第一次搬家的樣子了。於是,b廠史無前例的進行了連續三次搬家。

雖然我們都知道度度熊的「機智」常常令人堪憂,但是不可思議的是,這回真的應驗了。第三次搬家後的結果和第一次的結果完全相同。

那麼,有多少種指示會讓這種事情發生呢?如果兩種指示中至少有乙個人的目標位置不同,就認為這兩種指示是不相同的。

input

第一行乙個整數

t ,表示t組資料。

每組資料報含乙個整數n(

1≤n≤

1000

000)。

output

對於每組資料,先輸出一行 case #i: 然後輸出結果,對

1000000007

取模。

sample input

2

13

sample output

case #1:

1case #2:

4

思路:

因為第三次三次後恢復到第一次的樣子,所以第二次和沒搬家的時候也是完全相同的,所以搬家情況有可能有兩家換,也有可能都沒換(原因是換兩次和沒換一樣,不懂的動手寫下),即假設有n戶人需要搬家,符合條件的方案數為a[n],當有另外一家人要搬家的時候,如果他不搬,那麼方案數為a[n],如果他要搬家,那麼他與任意其中一戶人家形成一對,則剩下的人的方案數為a[n-1]。則,a[n+1]=a[n]+n*a[n-1]。值得注意的是,n*a[n-1]會溢位int,所以要用long long來存。而且a[1]=1,a[2]=2。

**如下:

#include#include#include#include#include#include#includeusing namespace std;

long long a[1000005]=;

const int inf=0x3f3f3f3f;

const int mod=1000000007;

int main()

while(scanf("%d",&t)!=eof)

}return 0;

}

2015百度之星資格賽1001

題目名稱 大搬家 problem description 近期b廠組織了一次大搬家,所有人都要按照指示換到指定的座位上。指示的內容是坐在位置 i 上的人要搬到位置 j 上。現在b廠有 n 個人,一對一到 n 個位置上。搬家之後也是一一對應的,改變的只有位次。在第一次搬家後,度度熊由於疏忽,又要求大家...

2015百度之星資格賽1001 大搬家

這題主要是找規律,組合數學和遞推式。舉個例子啊,987654321 912345678 我們從最小的單位 乙個數開始考慮它的所有情況,共有兩種 1.不換位置 4 4 2.與其他數的位置對換 7 2,2 7 我們記共有i個數時的可能性為f i 對於一排數來說,如果乙個數不換位置 情況一 那麼整排數的可...

2015百度之星資格賽1002

problem description 列變位法是古典密碼演算法中變位加密的一種方法,具體過程如下 將明文本元分割成個數固定的分組 如5個一組,5即為金鑰 按一組一行的次序整齊排列,最後不足一組不放置任何字元,完成後按列讀取即成密文。比如 原文 123456789 金鑰 4 變換後的矩陣 1234 ...