poj 3735 矩陣行列變換

2021-06-05 12:30:13 字數 1379 閱讀 4387

這題是矩陣運算的經典題目。

可以將peanut初始化為,,,},然後對peanut矩陣進行變換(行變換,可以對單位矩陣操作,然後放在左邊乘以peanut。列變換則放在右邊)。還有矩陣的運算符合結合率,不符合交換率。

進行矩陣的n次方運算的時候,我一直沒用二進位制的思想,一直在模擬遞迴的過程,結果不斷超時,感覺複雜度跟二進位制的思想差不多的,奇怪了。後來用了二進位制的思想才過了。二進位制的思想就是不斷進行的平方的運算,如果遇到1就累加上去。

#include #include #include using namespace std;

struct matrix

;matrix mul(matrix num1,int n1,int m1,matrix num2,int n2,int m2)//m1 = n2}}

} }return res;

}matrix pow(matrix num1,int k,int n)

else

k = (k >> 1);

} matrix res;

cnt--;

matrix first;

memcpy(&first,&num1,sizeof(first));

while(cnt != -1)

else

cnt--;

} *///模擬遞迴

matrix res;

memcpy(&res,&num1,sizeof(num1));

memset(&res,0,sizeof(res));

int i;

for(i = 0; i <= n; i++)

while(k)

num1 = mul(num1,n,n,num1,n,n);

k >>= 1;

}//二進位制思想

return res;

}int main()

int i;

char str[2];

matrix cat;

memset(&cat, 0, sizeof(cat));

cat.m[n][0] = 1;

matrix one;

memset(&one, 0, sizeof(one));

for(i = 0; i <= n; i++)

int j;

for(j = 0; j < m; j++)

else if(strcmp(str,"e") == 0)

}else if(strcmp(str,"s") == 0)

}} one = pow(one,k,n);

cat = mul(one,n,n,cat,n,1);

for(i = 0; i < n; i++)

}}

poj 3735 (矩陣快速冪)

題意 有n只貓咪,開始時每只貓咪有花生0顆,現有一組操作,由下面三個中的k個操作組成 1.g i 給i只貓咪一顆花生公尺 2.e i 讓第i只貓咪吃掉它擁有的所有花生公尺 3.s i j 將貓咪i與貓咪j的擁有的花生公尺交換 現將上述一組操作做m次後,問每只貓咪有多少顆花生?解題報告 view co...

構造矩陣 矩陣快速冪 POJ3735

這題題意如下,有n 只貓咪,三種關於花生的命令 得花生,吃花生,交換花生 給出一套命令,重複 n 次,問最後每只貓咪得到多少花生。m那麼大,毫無疑問,矩陣快速冪。先構造乙個單位矩陣,因為只需在單位矩陣上進行操作,然後用操作完之後得到的矩陣乘以初始的狀態就得到最終的狀態。看下圖 第 i 只貓咪得花生就...

POJ3735 mat乘法優化

題目意思 有n只貓,有三種操作得花生,吃花生,換花生。k種操作,進行m輪 解題思路 m很大,考慮矩陣變化,考慮每乙個變化過程,由於有加一,將初始矩陣末尾增加一,方便進行操作,然後有如下網上借鑑 chaoxi 來的變換。要注意的是 題意很簡單但是因為理解錯題意,以為重複m次是每進行一次操作就重複,但是...