日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hdu4920 矩阵乘法%3

發布時間:2025/6/17 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hdu4920 矩阵乘法%3 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題意:
? ? ?給你兩個矩陣,讓你求兩矩陣的乘積,然后3取余。矩陣是n*n的,n<=800

思路:
? ? ? ?如果什么都不考慮的話,矩陣的乘法是o(n^3)的,800*800*800 = 512000000,超時那是妥妥的,而且還用到取余,%這個東西在我的印象里是很費時間的,回到這道題目,我們發現一個很關鍵的地方,就是%3,那么也就是說只有0.1.2這三種狀態,這樣的話我們直接改變一下矩陣乘法的循環順序,然后每次跳過0,就可以節省1/3的時間了,然后就ac了,但是后來發現個很奇怪的地方就是如果不優化0,只要改變一下循環順序也可以ac,
TLE
for(i = 1 ;i <= n ;i ++)
for(j = 1 ;j <= n ;j ++)
for(k = 1 ;k <= n ;k ++)
c[i][j] = c[i][j] + a[i][k] * b[k][j]
AC
for(k = 1 ;k <= n ;k ++)
for(i = 1 ;i <= n ;i ++)
for(j = 1 ;j <= n ;j ++)
c[i][j] = c[i][j] + a[i][k] * b[k][j]
或者
for(k = 1 ;k <= n ;k ++)
for(i = 1 ;i <= n ;i ++)
if(a[i][k])
for(j = 1 ;j <= n ;j ++)
c[i][j] = c[i][j] + a[i][k] * b[k][j]


上面第一種超時,第三種是優化了0,也就是優化掉了1/3的時間可以ac可以接受,但是接受不了的就是第二種為什么會ac,我后來查了寫for循環的東西,知道了一點,
(1)
for(i = 1 ;i <= 10000 ;i ++)
for(j = 1 ;j <= 100 ;j ++)
(2)
for(i = 1 ;i <= 100 ;i ++)
for(j = 1 ;j <= 10000 ;j ++)


在算法的角度去考慮,上面兩個的時間復雜度是一樣的,但是在匯編角度去考慮,(2)會比(1)快很多,至于為什么,我不是很懂匯編,所以不能用匯編來解釋,但是我猜測有可能是這樣,第一層循環跳到第二層循環的時候有一些操作a,(1)比(2)多做了很多操作a,其余的地方他倆用的時間一樣,這樣就可能造成(2)比(1)快《結論是對的,證明是自己瞎猜的》,估計這個題目也是因為類似于這樣的東西導致的第二種情況能ac<上面的這些都是我自己猜的,有了解的希望能給我留個言,我也學習學習>


#pragma comment(linker, "/STACK:1024000000,1024000000") #include<stdio.h> #include<string.h> typedef struct {int mat[810][810]; }A;A mat_mat(A a ,A b ,int n) {A c;memset(c.mat ,0 ,sizeof(c.mat));for(int k = 1 ;k <= n ;k ++)for(int i = 1 ;i <= n ;i ++){if(a.mat[i][k])for(int j = 1 ;j <= n ;j ++)c.mat[i][j] = c.mat[i][j] + a.mat[i][k] * b.mat[k][j];}return c; } A a ,b ,c; int main () {int n ,i ,j;while(~scanf("%d" ,&n)){for(i = 1 ;i <= n ;i ++)for(j = 1 ;j <= n ;j ++){scanf("%d" ,&a.mat[i][j]);a.mat[i][j] %= 3;}for(i = 1 ;i <= n ;i ++)for(j = 1 ;j <= n ;j ++){scanf("%d" ,&b.mat[i][j]);b.mat[i][j] %= 3;}c = mat_mat(a ,b ,n);for(i = 1 ;i <= n ;i ++)for(j = 1 ;j <= n ;j ++)if(j == n) printf("%d\n" ,c.mat[i][j] % 3);else printf("%d " ,c.mat[i][j] % 3);}return 0; }

總結

以上是生活随笔為你收集整理的hdu4920 矩阵乘法%3的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。