1. 程式人生 > >BZOJ 2476 戰場的數目 矩陣乘法

BZOJ 2476 戰場的數目 矩陣乘法

題目大意:令戰場定義為可以從中間某個點向兩邊單調不增且不是一個長方形的柱子的序列,求周長為p的柱子有多少個

令f[n]為周長為2n的戰場數 不考慮【不是長方形】這個條件

如果一個戰場左右都沒有高度為1的柱子,則方案數等價於將最下方一排砍掉的方案數 即f[n-1]

如果一個戰場左側或右側有一個高度為1的柱子,則方案數等價於砍掉這個高度為1的柱子的方案數 即2*f[n-1]

但是如果一個戰場左側和右側都有一個高度為1的柱子,那麼這個戰場被上面那種情況計算了兩次,要減掉 方案數是f[n-2]

故得到遞推式f[n]=3*f[n-1]-f[n-2] 矩陣乘法搞出來 再減去長方形的方案數 即n-1即可

小心負號。。。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define MOD 987654321
using namespace std;
typedef long long ll;
struct Matrix{
	ll xx[2][2];
	Matrix(ll _=0,ll __=0,ll ___=0,ll ____=0)
	{
		xx[0][0]=_;
		xx[0][1]=__;
		xx[1][0]=___;
		xx[1][1]=____;
	}
	ll* operator [] (int x)
	{
		return xx[x];
	}
	friend void operator *= (Matrix &x,Matrix y)
	{
		int i,j,k;
		Matrix z;
		for(i=0;i<2;i++)
			for(j=0;j<2;j++)
				for(k=0;k<2;k++)
					z[i][j]+=x[i][k]*y[k][j],z[i][j]%=MOD;
		x=z;
	}
};
int n;
Matrix Quick_Power(Matrix x,int y)
{
	Matrix re(1,0,0,1);
	while(y)
	{
		if(y&1) re*=x;
		x*=x;y>>=1;
	}
	return re;
}
int Calculate(int n)
{
	if(n<=7) return 0;
	if(n&1) return 0;
	n>>=1;
	Matrix re=Quick_Power(Matrix(0,987654320,1,3),n-4);
	return (5*re[0][0]+13*re[1][0]-(n-1)%MOD+MOD)%MOD;
}
int main()
{
	while(cin>>n,n)
		cout<<Calculate(n)<<endl;
	return 0;
}


相關推薦

BZOJ 2476 戰場數目 矩陣乘法

題目大意:令戰場定義為可以從中間某個點向兩邊單調不增且不是一個長方形的柱子的序列,求周長為p的柱子有多少個 令f[n]為周長為2n的戰場數 不考慮【不是長方形】這個條件 如果一個戰場左右都沒有高度為1的柱子,則方案數等價於將最下方一排砍掉的方案數 即f[n-1] 如果一個戰

[BZOJ 2738]矩陣乘法

mes nbsp pda splay 樹狀 getc ++ 矩陣乘法 array [BZOJ 2738]矩陣乘法 題目 給你一個N*N的矩陣,不用算矩陣乘法,但是每次詢問一個子矩形的第K小數。 INPUT 第一行兩個數N,Q,表示矩陣大小和詢問組數;接下來N行N

BZOJ 1009--GT考試(KMP&DP&矩陣乘法)

color efi namespace highlight long 情況 ref urn scanf     RP++ 題目鏈接:     http://www.lydsy.com/JudgeOnline/problem.php?id=1009 Solution

【Codeforces 506E】Mr.Kitayuta’s Gift&&【BZOJ 4214】黃昏下的禮物 dp轉有限狀態自動機+矩陣乘法優化

合數 現在 子序列 pri blue gre () div while 神題……胡亂講述一下思維過程……首先,讀懂題.然後,轉化問題為構造一個長度為|T|+n的字符串,使其內含有T這個子序列.之後,想到一個簡單的dp.

BZOJ 3326】[Scoi2013]數數 數位dp+矩陣乘法優化

spa void pla color calc() class fin 左右 明顯 挺好的數位dp……先說一下我個人的做法:經過觀察,發現這題按照以往的思路從後往前遞增,不怎麽好推,然後我就大膽猜想,從前往後推,發現很好推啊,維護四個變量,從開始

bzoj 1706: [usaco2007 Nov]relays 奶牛接力跑【矩陣乘法+Floyd】

mes AD etc err 一次 鄰接矩陣 a* 是把 for 唔不知道怎麽說……大概核心是把矩陣快速冪的乘法部分變成了Floyd一樣的東西,非常之神 首先把點離散一下,最多有200個,然後建立鄰接矩陣,a[u][v]為(u,v)之間的距離,沒路就是inf 然後註意重載乘

bzoj 1875 [SDOI2009]HH去散步 矩陣乘法

不能 ack read class for har ans sin clear 題面 題目傳送門 解法 如果沒有不能經過上一次經過的邊這個限制,顯然就是矩陣乘法的裸題 那麽我們考慮轉化一下,把邊當成點 將一條無向邊拆成2條有向邊,然後連邊,設鄰接矩陣為\(A\) 將\(A\

bzoj 4162 shlw loves matrix II - 行列式 - 矩陣乘法 - 高斯消元

題目大意: 給一個nn的矩陣A,求其k次方。 n ≤ 50

BZOJ 2326: [HNOI2011]數學作業(矩陣乘法)

can zoj define 遞推 \n problem main i++ std 傳送門 解題思路   NOIp前看到的一道題,當時想了很久沒想出來,NOIp後拿出來看竟然想出來了。註意到有遞推\(f[i]=f[i-1]*poww[i]+i\),\(f[i]\)表示\(1

bzoj 1009 GT考試 (KMP+矩陣乘法)

題目大意:給定一個由數字構成的字串A(len<=20),讓你選擇一個長度為n(n是給定的)字串X,一個合法的字串X被定義為,字串X中不存在任何一段子串與A完全相同,求互不相同的合法的字串L的數量 第一眼看就沒啥思路....瞅了一眼題解,是KMP優化DP,然後再用矩陣優

bzoj 4162: shlw loves matrix II 拉格朗日插值法+矩陣乘法

題意 給定矩陣 M,請計算 M^n,並將其中每一個元素對 1000000007 取模輸出。 對於 100% 資料,滿足 n <= 2^10000;k <= 50; 0 <= Mij < 10^9 +7 分析 我們可以帶入k+1

BZOJ 2738 矩陣乘法 整體二分

題意:   給出n*n的矩陣,求出子矩陣的k小值 分析:   真理:當一個題的題目名是一個演算法時,這道題多半和這個演算法沒啥關係。   其實就是把整體二分的步驟放到二維了。我們需要一個二維線段樹來查詢操作。   其他嘛,直接把矩陣抻成序列即可。(但要記得記錄二維座標) 程式碼: #inc

BZOJ 4818】 4818: [Sdoi2017]序列計數 (矩陣乘法、容斥計數)

【分析】   f[i][j]表示填i個數,mod為j的方案數。   這個轉移可以用矩陣加速啦,那麼n很大也沒關係了。   然後要至少有一個質數,就用總方案數-沒有一個質數。   然後一開始跑20s,看到別人2s,然後覺得這個迴圈矩陣的矩陣乘法可以O(n^2),改了就2s了。。 1 #include

BZOJ 2738 矩陣乘法 (整體二分+二維樹狀陣列)

題目大意:略 洛谷傳送門 多次詢問第k小,考慮整體二分 考慮二分答案,為了避免同一權值的數出現在不同位置的情況,用一個$vector$儲存權值為i的點在那些位置。而權值可能會很大,我們將其離散。 每次選擇一個答案$mid$,把矩陣中權值為$[l,mid]$的點加入到二維樹狀陣列中,即可在$O(log^

BZOJ 2738 矩陣乘法 (整體二分+二維樹狀數組)

sort ret 分答 truct show tmp 二分答案 += all 題目大意:略 洛谷傳送門 多次詢問第k小,考慮整體二分 考慮二分答案,為了避免同一權值的數出現在不同位置的情況,用一個$vector$存儲權值為i的點在那些位置。而權值可能會很大,我們將其離

bzoj 2738 矩陣乘法

2738: 矩陣乘法 Time Limit: 20 Sec Memory Limit: 256 MB Submit: 1529 Solved: 660 [Submit][Status][Discuss] Description   給你一個N*N的

矩陣乘法專題1——bzoj 1297 [SCOI2009] 迷路題解

【原題】 1297: [SCOI2009]迷路 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 539  Solved: 367 [Submit][Status] Description windy在有向圖中迷路了。

BZOJ 3329 Xorequ (數位DP、矩陣乘法)

details href 一個 。。 序列 zoj 快速冪 二進制 寫代碼 手動博客搬家: 本文發表於20181105 23:18:54, 原地址https://blog.csdn.net/suncongbo/article/details/83758728 題目鏈接 ht

BZOJ 1494 NOI2007 生成樹計數 狀壓DP+矩陣乘法

題目大意:給定n(n≤1015)個點,編號差不超過k(k≤5)的點之間有連邊,問生成樹個數 將k個點的連通性用最小表示法壓成狀態,那麼最多有52種狀態 計算出每個狀態的生成樹個數,作為初始行向量A 對於每種狀態考慮新加入一個點並向這k個點連邊,每種連法可以

BZOJ P2476:戰場數目

好神的遞推+矩陣優化加速啊 我們不管矩形的存在 那麼我們加速目前需要x條邊的戰場 那麼我們分類討論 1.這個戰場只有右邊或左邊有一個格子,那麼我們把這個格子去掉之後,非常顯然的得到了p-2條邊的戰場 2.左邊和右邊都有,那麼我們把這兩個格子都去掉之後會發現得到了p-4條邊的