2014 Multi-University Training Contest 5
其实根本不是一题水题,具体题解见HDU微博
但是因为叉姐没有卡读入挂,你加个读入挂就可以过了
或者,你用C++的编译语言交也可以过
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
using namespace std;
#define L 805
template<class T>
inline bool read(T &n)
{
T x = 0, tmp = 1; char c = getchar();
while((c < '0' || c > '9') && c != '-' && c != EOF) c = getchar();
if(c == EOF) return false;
if(c == '-') c = getchar(), tmp = -1;
while(c >= '0' && c <= '9') x *= 10, x += (c - '0'),c = getchar();
n = x*tmp;
return true;
}
template <class T>
inline void write(T n)
{
if(n < 0)
{
putchar('-');
n = -n;
}
int len = 0,data[20];
while(n)
{
data[len++] = n%10;
n /= 10;
}
if(!len) data[len++] = 0;
while(len--) putchar(data[len]+48);
}
int n;
int ta[L];
int tb[L];
int a[L][L];
int b[L][L];
int c[L][L];
void matrixMul(){
memset(c,0,sizeof(c));
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
if(a[i][j]==0) continue;
for(int k=1;k<=n;k++) c[i][k] = (c[i][k] + a[i][j]*b[j][k])%3;
}
}
}
int main(){
while(read(n)){
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
read(a[i][j]),a[i][j]%=3;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
read(b[i][j]),b[i][j]%=3;
matrixMul();
for(int i=1;i<=n;i++){
for(int j=1;j<=n-1;j++)
write((c[i][j]+3)%3),putchar(' ');
write((c[i][n]+3)%3),putchar('\n');
}
}
return 0;
}
按照比赛的时候最早的想法:忽略0的值,1 * 1 = 1 , 2 * 1 = 2 ,1 * 2 = 2 ,2 * 2 = 1
bitset记录上面,然后用 & 的 bitset 的count 计算组合后的个数
#include <algorithm>
#include <iostream>
#include <iomanip>
#include <cstring>
#include <climits>
#include <complex>
#include <fstream>
#include <cassert>
#include <cstdio>
#include <bitset>
#include <vector>
#include <deque>
#include <queue>
#include <stack>
#include <ctime>
#include <set>
#include <map>
#include <cmath>
#define eps 1e-9
#define INF 0x3f3f3f3f
using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<ll, ll> pll;
typedef complex<ld> point;
typedef pair<int, int> pii;
typedef pair<pii, int> piii;
template<class T>
inline bool read(T &n)
{
T x = 0, tmp = 1; char c = getchar();
while((c < '0' || c > '9') && c != '-' && c != EOF) c = getchar();
if(c == EOF) return false;
if(c == '-') c = getchar(), tmp = -1;
while(c >= '0' && c <= '9') x *= 10, x += (c - '0'),c = getchar();
n = x*tmp;
return true;
}
template <class T>
inline void write(T n)
{
if(n < 0)
{
putchar('-');
n = -n;
}
int len = 0,data[20];
while(n)
{
data[len++] = n%10;
n /= 10;
}
if(!len) data[len++] = 0;
while(len--) putchar(data[len]+48);
}
//-----------------------------------
const int MAXN=1000;
int n,A,B;
bitset <MAXN> a[3][MAXN],b[3][MAXN];
void init()
{
for(int k=1;k<3;k++)
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
a[k][i].reset(j);
b[k][j].reset(i);
}
}
int main()
{
while(read(n))
{
init();
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
read(A);
A%=3;
a[A][i].set(j);
}
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
read(B);
B%=3;
b[B][j].set(i);
}
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
int ans=0;
ans+=(a[1][i] & b[1][j]).count();
ans+=(a[1][i] & b[2][j]).count()*2;
ans+=(a[2][i] & b[1][j]).count()*2;
ans+=(a[2][i] & b[2][j]).count();
write(ans%3);
if(j==n-1)
puts("");
else
putchar(' ');
}
}
return 0;
}