那么第一天放的细菌,第k天的时候状态就是
A
×
M
k
−
1
A \times M^{k - 1}
A×Mk−1
这下我们就知道第一天放的细菌数量了
那第二天放的呢, 同理是不是就得出状态是
A
×
M
k
−
2
A \times M^{k - 2}
A×Mk−2
同理第
2
l
2^l
2l 天放的呢,是不是就是
A
×
M
k
−
2
l
A \times M^{k - 2 ^ l}
A×Mk−2l
那第k天所有的细菌也就是第一天放+第二天放的+… + 第
2
l
2^l
2l 天放的
思路给出来了,如果没有学过矩阵快速幂,先去温习一下,代码具体就自己写了
(本人蒻蓟,勿喷)
java代码如下
importjava.io.BufferedReader;importjava.io.IOException;importjava.io.InputStreamReader;importjava.io.PrintWriter;importjava.util.StringTokenizer;/**
* @Author congege
* @Description
* @Date Created in 2024/2/10-18:17
* https://www.lanqiao.cn/problems/8519/learning/?page=1&first_category_id=1
*/publicclassMain{staticFastReader sc =newFastReader();staticPrintWriter out =newPrintWriter(System.out);staticlongP=(int)1e9+7;staticlong[][] a;staticlong k;publicstaticvoidmain(String[] args){
k = sc.nextLong();long[][] res =newlong[4][4];long day;for(day =1; day <= k; day *=2){init();
res =add(res,qkm(k - day));}for(int i =0; i <4; i++){long sum =0;for(int j =0; j <4; j++){
sum =(sum + res[j][i])%P;}
out.print(sum);
out.print(' ');}
out.flush();}staticvoidinit(){
a =newlong[][]{{0,1,1,0},{0,0,2,0},{1,0,0,1},{1,1,1,0}};}staticlong[][]qkm(long k){long[][] res =getE();while(k >0){if((k &1)==1) res =mul(res, a);
a =mul(a, a);
k >>=1;}return res;}staticlong[][]getE(){long[][]E=newlong[4][4];for(int i =0; i <4; i++){E[i][i]=1;}returnE;}staticlong[][]mul(long[][] a1,long[][] a2){long[][] res =newlong[4][4];for(int i =0; i <4; i++){for(int j =0; j <4; j++){for(int k =0; k <4; k++){
res[i][j]=(res[i][j]+ a1[i][k]* a2[k][j])%P;}}}return res;}staticlong[][]add(long[][] a1,long[][] a2){long[][] res =newlong[4][4];for(int i =0; i <4; i++){for(int j =0; j <4; j++){
res[i][j]=(a1[i][j]+ a2[i][j])%P;}}return res;}}classFastReader{StringTokenizer st;BufferedReader br;FastReader(){
br =newBufferedReader(newInputStreamReader(System.in));}Stringnext(){while(st ==null||!st.hasMoreElements()){try{
st =newStringTokenizer(br.readLine());}catch(IOException e){
e.printStackTrace();}}return st.nextToken();}intnextInt(){returnInteger.parseInt(next());}doublenextDouble(){returnDouble.parseDouble(next());}StringnextLine(){String s ="";try{
s = br.readLine();}catch(IOException e){
e.printStackTrace();}return s;}longnextLong(){returnLong.parseLong(next());}booleanhasNext(){while(st ==null||!st.hasMoreElements()){String s =nextLine();if(s ==null){returnfalse;}
st =newStringTokenizer(s);}returntrue;}}