考场成功被这题诈骗,原因是感觉不符合 S 组难度。
本来 2min 就能想出大常数线性解法的,结果一看 n≤8?
大概代码是这样:
int a[10];
int b[650001];
struct Lock{
int f[5];
Lock(int x){
f[0] = x>>16;
f[1] = (x>>12)&0xf;
f[2] = (x>>8)&0xf;
f[3] = (x>>4)&0xf;
f[4] = x&0xf;
}
int toInteger(){
int s = 0;
for (int i = 0; i < 5; ++i) s = (s<<4)|f[i];
return s;
}
};
// void op(Lock lk){
// for (int i = 0; i < 5; ++i) write(lk.f[i]);
// writeln(lk.toInteger());
// }
void transform(int x){
Lock lk(x);
for (int i = 0; i < 5; ++i){
for (int j = 9; j; --j)
lk.f[i] = (lk.f[i]+1)%10, ++b[lk.toInteger()];
lk.f[i] = (lk.f[i]+1)%10;
}
for (int i = 0; i < 4; ++i){
for (int j = 9; j; --j)
lk.f[i] = (lk.f[i]+1)%10, lk.f[i+1] = (lk.f[i+1]+1)%10, ++b[lk.toInteger()];
lk.f[i] = (lk.f[i]+1)%10, lk.f[i+1] = (lk.f[i+1]+1)%10;
}
}
int main(){
int n; read(n);
for (int i = 1; i <= n; ++i){
int x;
for (int j = 5; j; --j) read(x), a[i] = (a[i]<<4)|x;
}
for (int i = 1; i <= n; ++i) transform(a[i]);
int ans = 0;
for (int i = 0; i < 650001; ++i) if (b[i] == n) ++ans;
writeln(ans);
return 0;
}
(不要问我为什么考场不写在线
显然复杂度是 Θ(n) 的,带一个巨大常数(大概 102∼103 量级),那完全可以放 104 以上啊,为什么 n≤8 /yiw