HDU 4920 Matrix multiplication

本文探讨了在处理模数为3的问题时,如何利用bitset进行优化,通过实例展示了一种高效的解决方法。

因为模数为3,所以可以用bitset优化。。。简直666

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <vector>
#include <algorithm>
#include <map>
#include <set>
#include <bitset>

using namespace std;

int n,m,a,b,x,y;

bitset <1005> x_1[805],x_2[805],y_1[805],y_2[805];

int main()
{
    //freopen("in.txt","r",stdin);
    while(scanf("%d",&n)==1)
    {
        for(int i=0;i<=n;++i)
        {
            x_1[i].reset();x_2[i].reset();
            y_1[i].reset();y_2[i].reset();
        }
        for(int i=0;i<n;++i)
        {
            for(int j=0;j<n;++j)
            {
                scanf("%d",&a);
                if(a%3==1)x_1[i].set(j);
                else if(a%3==2)x_2[i].set(j);
            }
        }
        for(int i=0;i<n;++i)
        {
            for(int j=0;j<n;++j)
            {
                scanf("%d",&a);
                if(a%3==1)y_1[j].set(i);
                else if(a%3==2)y_2[j].set(i);
            }
        }
        for(int i=0;i<n;++i)
        {
            for(int j=0;j<n;++j)
            {
                x=(x_1[i]&y_1[j]).count()+(x_2[i]&y_2[j]).count();
                y=(x_1[i]&y_2[j]).count()+(x_2[i]&y_1[j]).count();
                b=x+y*2;b%=3;
                if(j)putchar(' ');
                printf("%d",b);
            }
            puts("");
        }
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值