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,不要問