[R22B]数字圆环
数据规模:,。
思路
从位置 出发顺时针走一周得到的 位二进制数,其第 位(最高位为第 位)对应圆环上的数字 ,权重为 。
固定某个位置 上的数字 ,当起始位置 取遍 时, 在所得二进制数中的位次 也取遍 ,所以 对总和的总贡献为:
于是把所有位置相加:
其中 是字符串中 1 的个数。,,64 位整数足够。
复杂度
时间 ,空间 。
仓颉实现
import std.env.*
import std.convert.*
main(): Int64 {
let reader = getStdIn()
let n = Int64.parse(reader.readln().getOrThrow())
let s = reader.readln().getOrThrow()
// 统计 '1' 的个数
var cnt: Int64 = 0
for (r in s.toRuneArray()) {
if (r == r'1') {
cnt += 1
}
}
// 计算 2^n - 1
var pow: Int64 = 1
for (_ in 0..n) {
pow = pow * 2
}
let ans = cnt * (pow - 1)
println(ans.toString())
return 0
}