這題是矩陣運算的經典題目。
可以將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次是每進行一次操作就重複,但是...