2014多校第五场最后一题,计算两个n*n的矩阵乘积模3的结果(n<=800)
1、朴素算法本来会超时,但是经过存储优化后可以通过
这样写会超时:
for (int i=1; i<=n;i++)
for (int j=1; j<=n;j++)
for (int k=1; k<=n;k++)
c[i][j]+=a[i][k]*b[k][j];
这样写就能过:
for(int k=1; k<=n; k++)
for (int i=1; i<=n;i++)
for (int j=1; j<=n;j++)
c[i][j]+=a[i][k]*b[k][j];
2、正解是用bitset
3、比赛时直接手动压位,但是统计二进制数中1的个数时出了错;
原来一直用的matrix67的《位运算讲稿》上的方法:
x := (x and$55555555) + ((x shr 1) and $55555555);
x := (x and$33333333) + ((x shr 2) and $33333333);
x := (x and$0F0F0F0F) + ((x shr 4) and $0F0F0F0F);
x := (x and$00FF00FF) + ((x shr 8) and $00FF00FF);
x := (x and$0000FFFF) + ((x shr 16) and $0000FFFF);
结果这种写法在hdu上会wa
所以要用
#define bit_cnt(x) __builtin_popcount((unsigned)x)