1. 程式人生 > >Queuing(矩陣快速冪(遞推and模板))

Queuing(矩陣快速冪(遞推and模板))

【題目來源】https://vjudge.net/problem/HDU-2604
【題意】
f,m分別是female與male的縮寫,假設有一個佇列裡面是這些字母縮寫,長度為L,那麼共有2^L種,如果含有fmf或者fff這種子佇列的佇列被稱為0佇列,其餘的被稱為E佇列,問,長度為k的有多少種E佇列。
【思路】
先推出前幾項,得到:
f[0]=0,f[1]=2,f[2]=4,f[3]=6,f[4]=9,f[5]=15,f[6]=25;
故得到關係式:f[x]=f[x-1]+f[x-3]+f[x-4]。
其中x>=5.
所以(矩陣1)^(k-4)*矩陣2=矩陣3
我們要求矩陣3,首先要構造矩陣1和矩陣2。
那麼怎麼構造呢?
首先,構造矩陣1:
在f[x]=f[x-1]+f[x-3]+f[x-4]式子裡:(一般遞推的矩陣2都是由關係式得來的)
f[x]=f[x-1]++0*f[x-2]+f[x-3]+f[x-4]。
f[x-1]=1*f[x-1];
f[x-2]=1*f[x-2];
f[x-3]=1*f[x-3];
f[x-4]=1*f[x-4];
得到矩陣:
1 0 1 1
1 0 0 0
0 1 0 0
0 0 1 0
接著就是構造矩陣2:
f[x-1] 0 0 0
f[x-2] 0 0 0
f[x-3] 0 0 0
f[x-4] 0 0 0
……
沒啦。。。質疑可以發評論討論一下0.0 交流0.0
【程式碼】

#include<set>
#include<map>
#include<stack>
#include<cmath>
#include<queue>
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<limits.h>
#include<algorithm>
#define mem(a,b) memset(a,b,sizeof(a))
using namespace
std; const int mod=9973; typedef unsigned long long ll; typedef long long LL; int k,m; struct mat { int a[5][5]; mat() { mem(a,0); for(int i=1; i<=4; i++) a[i][i]=1; } }; mat operator*(mat s,mat t) { mat r; mem(r.a,0); for(int i=1; i<=4; i++) { for
(int j=1; j<=4; j++) { for(int p=1; p<=4; p++) { r.a[i][j]=r.a[i][j]+s.a[i][p]*t.a[p][j]; if(r.a[i][j]>=m) r.a[i][j]%=m; } } } return r; } void print(mat t) { for(int i=1; i<=4; i++) { for(int j=1; j<=4; j++) { printf("%d ",t.a[i][j]); } printf("\n"); } } mat pow_mat(mat &ans) { mat base,temp; mem(base.a,0); base.a[1][1]=1; base.a[1][3]=1; base.a[1][4]=1; for(int i=2; i<=4; i++) base.a[i][i-1]=1; k-=4; while(k) { if(k&1) temp=temp*base; base=base*base; k>>=1; } // print(temp); ans=temp*ans; } int main() { while(~scanf("%d%d",&k,&m)) { if(k<5) { int p=0; switch(k) { case 0: p=0; break; case 1: p=2; break; case 2: p=4; break; case 3: p=6; break; case 4: p=9; break; } printf("%d\n",p%m); } else { mat ans; mem(ans.a,0); ans.a[1][1]=9; ans.a[2][1]=6; ans.a[3][1]=4; ans.a[4][1]=2; pow_mat(ans); printf("%d\n",(ans.a[1][1])%m); } } }

相關推薦

POJ3070 Fibonacci矩陣快速加速模板題】

題目連結:傳送門 題目大意:   求斐波那契數列第n項F(n)。   (F(0) = 0, F(1) = 1, 0 ≤ n ≤ 109) 思路:   用矩陣乘法加速遞推。 演算法競賽進階指南的模板: #include <iostream> #include &l

Queuing矩陣快速and模板

【題目來源】:https://vjudge.net/problem/HDU-2604 【題意】 f,m分別是female與male的縮寫,假設有一個佇列裡面是這些字母縮寫,長度為L,那麼共有2^L種,如果含有fmf或者fff這種子佇列的佇列被稱為0佇列,其餘

洛谷P1357 花園狀態壓縮 + 矩陣快速加速

題目連結:傳送門 題目: 題目描述 小L有一座環形花園,沿花園的順時針方向,他把各個花圃編號為1~N(2<=N<=10^15)。他的環形花園每天都會換一個新花樣,但他的花園都不外乎一個規則,任意相鄰M(2<=M<=5,M<=N)個花圃中有不超過K(1&

HDU 5950 - Recursive sequence - [矩陣快速加速][2016ACM/ICPC亞洲區瀋陽站 Problem C]

題目連結:http://acm.hdu.edu.cn/showproblem.php?pid=5950 Farmer John likes to play mathematics games with his N cows. Recently, they are attracted by recursive

矩陣快速優化式 例:斐波那契數列

首先是一點基礎知識: ① 矩陣相乘的規則:矩陣與矩陣相乘 第一個矩陣的列數必須等於第二個矩陣的行數 假如第一個是m*n的矩陣 第二個是n*p的矩 陣則結果就是m*p的矩陣且得出來的矩陣中元素具有

Recursive sequence 矩陣快速公式

1. 通常首先能用矩陣快速冪優化的遞推型別是f[n]=5f[n-3]+6f[n-2]+2f[n-1]+n^2+n+8之類的也就是說遞推是線性遞推且f[n-i]前面的係數是常數,可以含有與n有關的多項式,也可以含有常數的這種遞推2.比如以下fn=2fn−2+fn−1+n4通常左

A Simple Math Problem矩陣快速模板

【題目來源】:https://vjudge.net/problem/HDU-1757 【題意】 求解數k對應的f(k)%m,關係式如題面所示。 【思路】 既然給出了遞推式,又因為k的取值上限相當大,所以使用矩陣快速冪來實現f(k)的求解。這個時候就可以用

【HDU2604】Queuing矩陣快速+

題目連結 Queuing Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(

POJ 3734 Blocks矩陣快速+矩陣

scan efi stdio.h opened ans hide 最終 spl pen 題意:個n個方塊塗色, 只能塗紅黃藍綠四種顏色,求最終紅色和綠色都為偶數的方案數。 該題我們可以想到一個遞推式 。 設a[i]表示到第i個方塊為止紅綠是偶數的方案數, b[i]為紅綠

矩陣快速共軛函式兩種

題目連結:https://cn.vjudge.net/contest/261339#problem/B AC1:ans= x(n)+y(n)*sqrt(6),所以,ans=x(n)+y(n)*sqrt(6)+(x(n)-y(n)*sqrt(6))-(x(n)-y(n)*sqrt(6))=2*

矩陣快速 ——表示式

 矩陣快速冪  首先知道矩陣       矩陣(Matrix)是一個按照長方陣列排列的複數或實數集合;      矩陣乘法: 定義:設A為  m×p  的矩陣,B為  p×n  的矩陣,那麼稱  m×n  的矩陣C為矩陣A與B的乘積,記作  C=A×B ,其中矩陣C中

藍橋杯演算法提高——求值矩陣快速

問題描述   已知遞推公式:   F(n, 1)=F(n-1, 2) + 2F(n-3, 1) + 5,   F(n, 2)=F(n-1, 1) + 3F(n-3, 1) + 2F(n-3, 2) + 3.   初始值為:F(1, 1)=2, F(1,

HDU 2604 Queuing 矩陣快速

/* * Author: illuz <iilluzen[at]gmail.com> * Blog: http://blog.csdn.net/hcbbt * File: 2604.cpp * Create Date: 2014-08-02 21:20

快速算法矩陣快速還不是很會。。日後會更新

代碼 -s get 運算 logs == data 。。 outb PS:轉載,自己寫的不如人家,怕誤導。轉載地址:http://www.cnblogs.com/CXCXCXC/p/4641812.html 首先,快速冪的目的就是做到快速求冪,假設我們要求a^b,按照樸素算

poj 3070 Fibonacci矩陣快速求Fibonacci數列

代碼 include cnblogs inf stream exp class set names 題目鏈接: http://poj.org/problem?id=3070 題意: 我們知道斐波那契數列0 1 1 2 3 5 8 13…… 數列中的第i位為第i-1位

poj 3735 Training little cats 矩陣快速

log ack make .cn code little logs 矩陣快速冪 style 題目鏈接: http://poj.org/problem?id=3735 題意: 有n只貓咪,開始時每只貓咪有花生0顆,現有一組操作,由下面三個中的k個操作組成:

[luoguP1962] 斐波那契數列矩陣快速

truct ons 技術 pan opera http 快速冪 printf ble 傳送門 解析詳見julao博客連接 http://worldframe.top/2017/05/10/清單-數學方法-——-矩陣/ —&

hdu 4965 Fast Matrix Calculation矩陣快速

觀察 while code 開始 mat col power tmp style 題意: 給你一個N*K的矩陣A和一個K*N的矩陣B,設矩陣C=AB,M=C^(N*N),矩陣Mmod6後,所有數的和是多少 思路: 剛開始我是直接計算的

hdu4565 So Easy!矩陣快速

利用 ace namespace ret bsp cst () easy for 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=4565 題解:(a+√b)^n=xn+yn*√b,(a-&rad

第十場 hdu 6172 Array Challenge矩陣快速

不知道 log tar 4.6 width += arr open ret http://acm.hdu.edu.cn/showproblem.php?pid=6172 題目大意:按照給出的公式算出an 解題思路:an=4an-1+17an-2-12an-3,不要問