1. 程式人生 > >湖南省第六屆大學生計算機程式設計競賽 戰場的數目

湖南省第六屆大學生計算機程式設計競賽 戰場的數目

戰場的數目

 

在上題中,假設戰場的圖形周長為p,一共有多少種可能的戰場?

例如,p<8時沒有符合要求的戰場,p=8時有2種戰場:

p=10有9種戰場:

要求輸出方案總數模987654321的值。

Input輸入檔案最多包含25組測試資料,每個資料僅包含一行,有一個整數p(1<=p<=109),表示戰場的圖形周長。p=0表示輸入結束,你的程式不應當處理這一行。Output對於每組資料,輸出僅一行,即滿足條件的戰場總數除以987654321的餘數。Sample Input
7
8
9
10
0
Sample Output
0
2
0
9
Hint
想法:
看了別人程式碼,思考許久。

戰場的定義比較趨近於俄羅斯方塊,及不能有懸空的塊;每個塊下面必須為底或者是另一個塊,並且這些塊不能構成一個矩形。

直接入手比較麻煩。

很顯然的就是高就是最高的塊所在的層數,寬也是最後一層的寬度。

分情況討論一下,顯然只有p為偶數的時候才可能有答案,奇數一定無解。

1.如果左/右只有一邊存在一個單獨的塊。

這樣刪掉這個塊將會得到周長為p2時的一種方案。

2.如果左/右都不存在單獨一個塊。

這樣無法通過刪單個塊得到一種周長為p2的方案,但是,可以通過去掉最後一層得到一種周長為p2的方案。

3.如果左/右都存在一個單獨的塊。

這種方案,會在情況1中額外統計,所以要減去,而這樣的方案數則對應是周長為p4時的方案。

然後就可以得到遞推式f(p) = 3*f(p - 2) - f(p - 4) (p>4)

f[p]=2f[p2]+f[p2]f[p4]=3f[p2]f[p4

然後這個顯然是可以矩陣乘法優化的,不過這樣會產生一些不必要的記憶體,所以我們把p=p/2然後就可以得到

f[p]=3f[p1]f[p2]

這樣得到的答案,是滿足的情況,是包含正好組成矩形的情況的,所以我們在最後把它減去即可。

又易知P=4時,有1種,P=6時,有2種,P=8時,有5種

發現f【p】為第(p-4+1)個斐波拉契數

程式碼:

#include <stdio.h> #include <algorithm> using namespace std; typedef long long ll; const ll mod=987654321; ll A[2][2],B[2][2],T[2][2]; void pow(int n)//求第n+1個的斐波拉契數 {     if(n==0)     {         //for(int i=0;i<2;i++)             //for(int j=0;j<2;j++)                // B[i][j]=(i==j);         B[0][0]=1;B[0][1]=0;B[1][0]=0;B[1][1]=1;         return;     }     if(n&1)     {         pow(n-1);         for(int i=0;i<2;i++)             for(int j=0;j<2;j++)             {                 T[i][j]=0;                     for(int k=0;k<2;k++)                         T[i][j]=(T[i][j]+A[i][k]*B[k][j])%mod;             }        for(int i=0;i<2;i++)             for(int j=0;j<2;j++)             {                 B[i][j]=T[i][j];             }     }     else     {         pow(n/2);         for(int i=0;i<2;i++)             for(int j=0;j<2;j++)             {                 T[i][j]=0;                 for(int k=0;k<2;k++)                     T[i][j]=(T[i][j]+B[i][k]*B[k][j])%mod;             }        for(int i=0;i<2;i++)           for(int j=0;j<2;j++)             {                 B[i][j]=T[i][j];             }     } } int main() {   int n;   A[0][0]=1; A[0][1]=1;   A[1][0]=1; A[1][1]=0;   while (scanf("%d", &n)== 1 && n)   {     ll ans=0;     if(n&1)         ans=0;     else if(n<4) ans=0;     else     {         pow(n-4);//求出B【0】【0】為周長為n的個數         ans=B[0][0]-(n/2-1);//減去矩形個數         ans%=mod;         if(ans<0) ans+=mod;     }     //printf("%lld\n",B[0][0]);     printf("%lld\n",ans);   }   return 0; }

相關推薦

湖南省大學生計算機程式設計競賽 戰場數目

戰場的數目   在上題中,假設戰場的圖形周長為p,一共有多少種可能的戰場? 例如,p<8時沒有符合要求的戰場,p=8時有2種戰場: p=10有9種戰場: 要求輸出方案總數模987654321的值。 Input輸入檔案最多包含25組測試資料,每個資料僅包含

戰場數目——湖南省大學生計算機程式設計競賽

戰場由若干單位正方形積木組成。積木佔據了連續的若干列,且圖形周長等於它最小包圍矩形的周長。假設戰場的圖形周長為p,一共有多少種可能的戰場? 戰場不能恰好為一個矩形。 例如,p<8時沒有符合要求的戰場,p=8時有2種戰場: p=10有9種戰場: 要求輸出方案總

湖南省大學生計算機程式設計競賽 弟弟的作業

你的弟弟剛做完了“100以內數的加減法”這部分的作業,請你幫他檢查一下。每道題目(包括弟弟的答案)的格式為a+b=c或者a-b=c,其中a和b是作業中給出的,均為不超過100的非負整數;c是弟弟算出的答案,可能是不超過200的非負整數,也可能是單個字元"?",表示他不會算

湖南省大學生計算機程式設計競賽__弟弟的作業

#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include <cmath> using namespace std; int chang

湖南省大學生計算機程式設計競賽I

I - 射擊遊戲   A和B在玩一個射擊遊戲,戰場由若干單位正方形積木組成。積木佔據了連續的若干列,且圖形周長等於它最小包圍矩形的周長。下圖(a)是一個合法的戰場,但(b)和(c)都不是:(b)中有空列;(c)的圖形周長為14,而最小包圍矩形(用虛線畫出)的周長為12。

湖南省大學生計算機程式設計競賽C題 Updating a Dictionary

#include <cstdio> #include <cstdlib> #include <string> #include <cctype> #include <map> #include <set> using namespac

2018湖南省14大學生計算機程式設計競賽---賣萌表情

用貪心來求。我的理解:用貪心來解決問題時要優先選擇貢獻大的。 對於後2種表情,直接列舉就行。 對於前面2種表情,先選擇倒著的笑臉,因為出現‘^ ’時,倒著的笑臉能儘可能多的使用‘v’. #include<bits/stdc++.h> #define ma

湖南省大學生計算機程式設計競賽:酷酷的單詞

1505: 酷酷的單詞 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 237 Solved: 88 [Submit][Status][Web Board] Description 輸入一些僅由小寫字母

湖南省大學生計算機程式設計競賽:殘缺的棋盤

1511: 殘缺的棋盤 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 169 Solved: 56 [Submit][Status][Web Board]Description] Input 輸入

CSU 1112 機器人的指令 (湖南省大學生計算機程式設計競賽

1112: 機器人的指令     Time Limit: 1 Sec    Memory Limit: 128 Mb    Submitted: 2335    Solved: 841  

2017年湖南省十三大學生計算機程式設計競賽-D Tian Ji's Horse Race Again

思路:貪心。對於King的馬a[n]和Tian的馬b[n],交換的k匹馬,肯定是取a[n]的最大值和b[n]的最小值交換,那麼對於a[],b[]的比較排列是固定的,因此主要怎麼求贏得次數,由於a,b都是由小到大排序的,因此可以先求出對於b[i]至少要交換多少匹馬才能夠

2017年湖南省十三大學生計算機程式設計競賽賽後總結

兩個月的賽前準備,終於在這一天,拿回了屬於我們蘇子降氣湯的榮耀,也是寫一篇部落格紀念紀念下,第一參加大賽的經歷。 身為本小組的隊長,但是整體的程式設計水平還是處於兩位隊友的水平之下(不是謙虛,是事實

2018年湖南省十四大學生計算機程式設計競賽 CSU 2164: 2018

題目傳送門 不會自己推,比賽現場找規律 程式碼: #include<bits/stdc++.h> using namespace std; typedef long long L

湖南省十二大學生計算機程式設計競賽 2016

1803: 2016 Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 537  Solved: 343 [Submit][Status][Web

湖南省十三大學生計算機程序設計競賽 Football Training Camp 貪心

mes 一場 problem play view ext lose names 輸出 2007: Football Training Camp【原創-轉載請說明】 Submit Page Summary Time Limit: 1 Sec Memory

2018湖南省14大學生計算機程序設計競賽 A字符畫

計算 NPU esc str 設計 c++ pla else i++ Description 讀入 w,請輸出 2018 的字符畫,兩個數字之間有 w 個空格。具體格式請參考樣例輸出。 1?≤?w?≤?2018 Input 輸入文件只包含 1 個整數 w. O

湖南省大學生程式競賽--戰場數目

題目I 戰場的數目 在上題中,假設戰場的圖形周長為p,一共有多少種可能的戰場? 例如,p<8時沒有符合要求的戰場,p=8時有2種戰場: p=10有9種戰場: 要求輸出方案總數模987654321的值。 輸入 輸入檔案最多包含25組測試資料,每個資料僅包含一

河南省大學生程序設計競賽--異形卵

con -s pad space 傳感器 math.h 水題 amp 歷史 異 形 卵 Time Limit: 1 Second Memory Limit: 64 MB Description 我們探索宇宙,是想了解浩瀚星空的奧妙,但我們卻非常少意識到宇宙

2018湖南省十四“嘉傑杯”大學生計算機程式設計競賽總結

      經過三個月的幸苦練習,在省賽這個大舞臺上,我們小隊收穫了一枚銅牌。       從一開始刷南陽oj八十道水題,vj上的二十場校賽,再到多校的場場自閉,CF的熬夜作戰。嗯,我確實付出了很多。 然而我始終在思考,我這麼多的付出到底學到了什麼。貌似也接觸了許多新演算

河南省大學生程式設計競賽 :異 形 卵

題目描述 我們探索宇宙,是想了解浩瀚星空的奧妙,但我們卻很少意識到宇宙深處藏匿的危險,它們無時無刻不緊盯著我們的地球。如果外星人拜訪我們,結果可能與哥倫布當年踏足美洲大陸不會有什麼兩樣,這是歷史,也是現實。 在ZDM-777星球上發現的休眠異形卵,其外表與常見的卵不同,表面被一層石墨覆蓋