戰場的數目——湖南省第六屆大學生計算機程式設計競賽
戰場由若干單位正方形積木組成。積木佔據了連續的若干列,且圖形周長等於它最小包圍矩形的周長。假設戰場的圖形周長為p,一共有多少種可能的戰場?
戰場不能恰好為一個矩形。
例如,p<8時沒有符合要求的戰場,p=8時有2種戰場:
p=10有9種戰場:
要求輸出方案總數模987654321的值。
Input輸入檔案最多包含25組測試資料,每個資料僅包含一行,有一個整數p(1<=p<=109),表示戰場的圖形周長。p=0表示輸入結束,你的程式不應當處理這一行。Output對於每組資料,輸出僅一行,即滿足條件的戰場總數除以987654321的餘數。Sample Input7
8
9
10
0Sample Output
0
2
0
9
Hint
思路:
根據題目意思可以得知這是一道找規律求遞推公式的題目,所以,需要從前往後推,憑空想象只能是浪費時間。
分析:
n=4 戰場數目為1(圖形即一個單位正方形)
n=6 戰場數目為2(圖形為兩個單位正方形橫著排列與豎著排列兩種)
n=8 戰場數目為5
奇數無解
以上數目都是包括組成圖形為矩形的,最後要減去這些數目。
從以上題目給出的圖和已經得出的結論嘗試推導遞推公式,周長為n的一個圖形如果左邊有一個單個的正方形,減去他就是周長n-2的一個圖形,同理右邊與最上方
也是這個道理,而左右各減去一個正方形即為周長n-4的圖形 這裡發現n-4的圖形包括在n-2中重複了,故遞推公式為 f(n)=3*f(n-2)-f(n-4);
現在的問題是如何求得f(n).
這裡用到了斐波拉契數列進行輔助。
在Fibonacci整數序列中,對於n≥2,F 0 = 0,F 1 = 1,F n = F n -1 + F n -2。例如,斐波那契序列的前十項是:
0,1,1,2,3,5,8,13,21,34,...
斐波納契序列的另一個公式是
。
求斐波拉契數列的f(n)我們用到了矩陣快速冪,而這道題同樣的也可以運用 矩陣快速冪進行求解,所以可以得知公式f的第一項為n=4, 後面的隨即求出。然後如何把這個
遞推公式與斐波拉契數列的遞推公式聯絡起來,思考與觀察後可以猜測f(n)(n>=4)=F(n-4+1),所以可以先令m=n-4,求得pow(m),然後返回F(m+1)即為所求的的值KK1(
沒有減去組成恰好為一個矩形的個數),所以還要求出一個公式為n/2-1,代表的是邊長為n的矩形由1*1的正方形組成總共有多少種組成方法,所以最後所求的答案為
KK1-n/2+1.
PS:第一道矩陣非常規題,自己還差的太遠,想了五個小時,一開始思路就錯了,難點在於斐波拉契數列 的聯絡。吸取教訓,繼續。
#include<stdio.h> #include<cstring> #include<iostream> using namespace std; #define ll long long #define mod 987654321 struct ju { ll m[2][2]; }ans,base; ju multi(ju a,ju b) { ll temp[2][2]; for(int i=0;i<2;i++) { for(int j=0;j<2;j++) { temp[i][j]=a.m[i][j]; } } for(int i=0;i<2;i++) { for(int j=0;j<2;j++) { a.m[i][j]=0; for(int w=0;w<2;w++) a.m[i][j]+=(temp[i][w]*b.m[j][w])%mod; } } return a; } int pow(int n) { base.m[0][0] = base.m[0][1] = base.m[1][0] = 1; base.m[1][1] = 0; ans.m[0][0] = ans.m[1][1] = 1; // ans 初始化為單位矩陣 ans.m[0][1] = ans.m[1][0] = 0; //n-=4; while(n) { if(n&1) { ans=multi(base,ans); } base=multi(base,base); n>>=1; } return ans.m[0][0]; } int main() { int n; while(scanf("%d",&n)&&n!=0) { if(n<8||n&1) printf("0\n"); else { ll kk1=(pow(n-4)-n/2+1)%mod; if(kk1<0) kk1+=mod; printf("%lld\n",kk1%mod); } } return 0; }
相關推薦
戰場的數目——湖南省第六屆大學生計算機程式設計競賽
戰場由若干單位正方形積木組成。積木佔據了連續的若干列,且圖形周長等於它最小包圍矩形的周長。假設戰場的圖形周長為p,一共有多少種可能的戰場? 戰場不能恰好為一個矩形。 例如,p<8時沒有符合要求的戰場,p=8時有2種戰場: p=10有9種戰場: 要求輸出方案總
湖南省第六屆大學生計算機程式設計競賽 戰場的數目
戰場的數目 在上題中,假設戰場的圖形周長為p,一共有多少種可能的戰場? 例如,p<8時沒有符合要求的戰場,p=8時有2種戰場: p=10有9種戰場: 要求輸出方案總數模987654321的值。 Input輸入檔案最多包含25組測試資料,每個資料僅包含
湖南省第六屆大學生計算機程式設計競賽 弟弟的作業
你的弟弟剛做完了“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年湖南省第十三屆大學生計算機程式設計競賽賽後總結
兩個月的賽前準備,終於在這一天,拿回了屬於我們蘇子降氣湯的榮耀,也是寫一篇部落格紀念紀念下,第一參加大賽的經歷。 身為本小組的隊長,但是整體的程式設計水平還是處於兩位隊友的水平之下(不是謙虛,是事實
湖南省第六屆大學生程式競賽--戰場的數目
題目I 戰場的數目 在上題中,假設戰場的圖形周長為p,一共有多少種可能的戰場? 例如,p<8時沒有符合要求的戰場,p=8時有2種戰場: p=10有9種戰場: 要求輸出方案總數模987654321的值。 輸入 輸入檔案最多包含25組測試資料,每個資料僅包含一
湖南省第十三屆大學生計算機程序設計競賽 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
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
河南省第六屆大學生程序設計競賽--異形卵
con -s pad space 傳感器 math.h 水題 amp 歷史 異 形 卵 Time Limit: 1 Second Memory Limit: 64 MB Description 我們探索宇宙,是想了解浩瀚星空的奧妙,但我們卻非常少意識到宇宙
2018湖南省第十四屆“嘉傑杯”大學生計算機程式設計競賽總結
經過三個月的幸苦練習,在省賽這個大舞臺上,我們小隊收穫了一枚銅牌。 從一開始刷南陽oj八十道水題,vj上的二十場校賽,再到多校的場場自閉,CF的熬夜作戰。嗯,我確實付出了很多。 然而我始終在思考,我這麼多的付出到底學到了什麼。貌似也接觸了許多新演算
湖南省第六屆 中信軟體教育杯 大學生程式設計大賽試題 第二題 弟弟的作業
弟弟的作業 Time Limit: 1000ms, Special Time Limit:2500ms,Memory Limit:65536KB Total submit users: 24, Accepted users:22 Problem 10