2016“百度之星”-測試賽

來源:互聯網
上載者:User

標籤:

1大搬家

Problem Description

近期B廠組織了一次大搬家,所有人都要按照指示換到指定的座位上。指示的內容是坐在位置i上的人要搬到位置j上。現在B廠有N個人,一對一到N個位置上。搬家之後也是一一對應的,改變的只有位次。在第一次搬家後,度度熊由於疏忽,又要求大家按照原指示進行了一次搬家。於是,機智的它想到:再按這個指示搬一次家不就可以恢複第一次搬家的樣子了。於是,B廠史無前例的進行了連續三次搬家。雖然我們都知道度度熊的“機智”常常令人堪憂,但是不可思議的是,這回真的應驗了。第三次搬家後的結果和第一次的結果完全相同。那麼,有多少種指示會讓這種事情發生呢?如果兩種指示中至少有一個人的目標位置不同,就認為這兩種指示是不相同的。

Input

第一行一個整數TTT,表示T組資料。每組資料包含一個整數N(1≤N≤1000000)。

Output

對於每組資料,先輸出一行 Case #i: 然後輸出結果,對1000000007模數。

Sample Input

213

Sample Output

Case #1:1Case #2:4

//第三次搬家後的結果和第一次的結果完全相同,這表明搬家的指令必定符合如下規則:i-->t--->i

//由於直接推導f(N)(N個位置下指示個數)顯得困難,於是很自然地考慮f(N+1)和f(N)是否存在遞推關係,我們作圖如下:

容易得到遞推式f[N+1]=f(N)+N*f(N-1)

同時f(0)=f(1)=1(因f(2)=f(1)+f(0)=2)

#include <stdio.h>#define ll long long#define MAXN 1000001#define mod 1000000007int F[MAXN];int main(){    int T,N,i;    scanf("%d",&T);    F[1] = F[0] = 1;    for(i=2;i<=MAXN;i++)    {        F[i] = F[i-1]%mod + (i-1)*(ll)F[i-2]%mod;        F[i] %= mod;    } // F[i] = F[i-1]%mod + (i-1)*(ll)F[i-2]%mod;//上面這樣寫,導致F[MAXN-1],F[MAXN-2]...可能大於mod //  F[MAXN] %= mod;    for(i=1;i<=T;i++)    {        scanf("%d",&N);        printf("Case #%d:\n%d\n",i,F[N]);    }    return 0;}

2.列變位法解密

Problem Description

列變位法是古典密碼演算法中變位加密的一種方法,具體過程如下 將明文字元分割成個數固定的分組(如5個一組,5即為密鑰),按一組一行的次序整齊排列,最後不足一組不放置任何字元,完成後按列讀取即成密文。比如:原文:123456789密鑰:4變換後的矩陣:123456789xxx(最後的幾個x表示無任何字元,不是空格,不是定位字元,就沒有任何字元,下同)密文:159263748再比如:原文:Hello, welcome to my dream world!密鑰:7變換後的矩陣:Hello,welcometo mydream world!xx密文:Hw doeetrrlloellc adoomm!,my e w實現一個利用列變位法的加密器對Bob來說輕而易舉,可是,對Bob來說,想清楚如何寫一個相應的解密器似乎有點困難,你能幫幫他嗎?

Input

第一行一個整數TTT,表示TTT組資料。每組資料包含222行第一行,一個字串s(1≤∣s∣≤1e5)),表示經過列變位法加密後的密文第二行,一個整數K(1≤K≤∣s∣)),表示原文在使用列變位法加密時的密鑰輸入保證密文字串中只含有ASCII碼在[0x20,0x7F)範圍內的字元

Output

對於每組資料,先輸出一行Case #i:然後輸出一行,包含一個字串s_decrypt,表示解密後得到的明文

Sample Input

41592637484Hw doeetrrlloellc adoomm!,my  e w7Toodming is best16sokaisan1

Sample Output

Case #1:123456789Case #2:Hello, welcome to my dream world!Case #3:Toodming is bestCase #4:sokaisan

//原文通過轉換矩陣得到密文,我們要通過密文得到原文,必須要藉助轉換矩陣的性質(但不能直接轉換成矩陣後再輸出--逾時)

//找到對應字元後即實現輸出,以第一行為例,第一個字元即為密文的首字元(實際上,密文的前 l=strlen(s)/K+(strlen(s)%K!=0)個字元即對應著轉換矩陣的第一列)

//輸出第二個字元及後面的字元時,必須考慮最後一行對應列是否為‘x‘(即不存在),若存在,則下一列在密文中的位置為前一列+len(即strlen(s)/K)+(mod!=0),否則+len

//依此輸出前len行,然後判斷mod(即strlen(s)%K)是否為0,不為0,代表最後一行有mod個元素要輸出,j*(len+1)-1即為對應列在密文中的位置

#include <stdio.h>#include <string.h>#define clen 10001char s[clen];int main(){    int T,K,i,k,j,len,mod,d;    scanf("%d",&T);    for(i=1;i<=T;i++)    {        getchar();        gets(s);        scanf("%d",&K);        printf("Case #%d:\n",i);        len = (int)strlen(s)/K;        mod = (int)strlen(s)%K;        //decode        for(k=0;k<len;k++)        {            for(j=0;j<=mod;j++)                printf("%c",s[k+j*(len+(mod!=0))]);            d = k+mod*(len+(mod!=0));            for(;j<K;j++)                printf("%c",s[d+(j-mod)*len]);//間距要發生變化        }        if(mod)// output the last list        {            for(j=1;j<=mod;j++)                printf("%c",s[j*(len+1)-1]);        }        printf("\n");    }    return 0;}

4.放盤子

Problem Description

小度熊喜歡惡作劇。今天他向來訪者們提出一個惡俗的遊戲。他和來訪者們輪流往一個正多邊形內放盤子。最後放盤子的是獲勝者,會贏得失敗者的一個吻。玩了兩次以後,小度熊發現來訪者們都知道遊戲的必勝策略。現在小度熊永遠是先手,他想知道他是否能獲勝。注意盤子不能相交也不能和多邊形相交也不能放在多邊形外。就是說,盤子內的點不能在多邊形外或者別的盤子內。

Input

第一行一個整數T,表示T組資料。每組資料包含3個數n,a,r(4≤n≤100,0<a<1000,0<r<1000)n是偶數,代表多邊形的邊數,a代表正多邊形的邊長,r代錶盤子的半徑。

Output

對於每組資料,先輸出一行Case #i:然後輸出結果.如果小度熊獲勝,輸出”Give me a kiss!” 否則輸出”I want to kiss you!”

Sample Input

24 50 2.54 5.5 3

Sample Output

Case #1:Give me a kiss!Case #2:I want to kiss you!

//由於多邊形的邊數n為偶數,很自然地用到對稱性,即先下的度度熊先嘗試在正多邊形放圓盤,若不能放,則顯然圓盤無法放入正多邊形

//度度熊輸,否則只要度度熊對稱(以中心)地放,無論什麼時候不能放盤,度度熊都贏,則實際上只要比較圓盤半徑和正多邊形中心到邊的距離即可

#include <stdio.h>#include <math.h>#define pi 3.14159265int main(){    int T,n,i;    double a,r;    scanf("%d",&T);    for(i=1;i<=T;i++)    {        scanf("%d%lf%lf",&n,&a,&r);        printf("Case #%d:\n",i);        if( a/(2*tan(pi/n)) >= r) puts("Give me a kiss!");        else puts("I want to kiss you!");    }    return 0;}

 

2016“百度之星”-測試賽

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.