題目描述:
q老師 對數列有一種非同一般的熱愛,尤其是優美的斐波那契數列。
當 x < 10 時,f(x) = x;
當 x ≥ 10 時,f(x) = a0 * f(x-1) + a1 * f(x-2) + a2 * f(x-3) + …… + a9 * f(x-10),ai 只能為 0 或 1。
q老師 將給定 a0~a9,以及兩個正整數 k m,詢問 f(k) % m 的數值大小。
聰明的你能通過 q老師 的考驗嗎?
input
輸出檔案包含多組測試用例,每組測試用例格式如下:
第一行給定兩個正整數 k m。(k < 2e9, m < 1e5)
第二行給定十個整數,分別表示 a0~a9。
output
對於每一組測試用例輸出一行,表示 f(k) % m 的數值大小。
sample input
10 9999
1 1 1 1 1 1 1 1 1 1
20 500
1 0 1 0 1 0 1 0 1 0
sample output
45104
題目分析:
本題就是經典的模板題了,首先把矩陣快速乘法的樣板寫上。
struct matrix}}
return ret;
}matrix()
matrix
(matrix&b)};
matrix quick_pow
(matrix a,
int x)
return ret;
}
然後就是資料處理了,首先如果小於10就是它本身,所以可以直接輸出。
if
(k<10)
然後就要構造矩陣了,很明顯如果把fx,fx-1,fx-2…這些為一列,然後右邊是fx-1,fx-2,fx-3…,那麼中間的資料就是矩陣了,首先第一行就是輸入的a0到a9,其餘的就是在第i行i-1列是1(矩陣從0開始,i從1開始),這樣就構造矩陣完成,只需要對這個矩陣進行運算就可以了。
for
(int i=
0;i<
10;i++
)for
(int i=
1;i<
10;i++
)
然後進行運算求出矩陣。
temp=
quick_pow
(temp,k-9)
;
然後就可以對著第一行求具體的值了,此時由於fx=x,那麼右側那一列就成了9876543210,這樣依次乘以快速乘法得到的矩陣第一行就可以了。不過既然結果說了要模m,就意味著這個數可能很大,所以為了防止溢位,我們每一次操作都要模m,也就是加上之後就模m。
int ans=0;
for(
int i=
0;i<
10;i++
)
**如下:
#include
#include
using
namespace std;
int k,m;
struct matrix}}
return ret;
}matrix()
matrix
(matrix&b)};
matrix quick_pow
(matrix a,
int x)
return ret;
}int
main()
matrix temp;
for(
int i=
0;i<
10;i++
)for
(int i=
1;i<
10;i++
) temp=
quick_pow
(temp,k-9)
;int ans=0;
for(
int i=
0;i<
10;i++
) cout<}}
第十四周作業
nat模式 1.臨時開啟 寫入記憶體,在記憶體中開啟 echo 1 proc sys net ipv4 ip forward 2.永久開啟 寫入核心 在 vim etc sysctl.conf 下 加入此行 net.ipv4.ip forward 1 lvs echo net.ipv4.ip for...
第十四周作業
1 匯入hellodb.sql生成資料庫 mysql uroot p123 h127.0.0.1 p3306 hellodb innodb.sql 1 在students表中,查詢年齡大於25歲,且為男性的同學的名字和年齡 2 以classid為分組依據,顯示每組的平均年齡 3 顯示第2題中平均年齡...
第十四周作業2
includeusing namespace std class student student next int num double score class mylist mylist int n,double s 以student n,s 作為單結點的鍊錶 int display 輸出鍊錶,返...