2P−1 的二进制表示为 P 个全 1 二进制位,在此基础上,对 10 做 500 次除法,即可顺利通过此题。
int nb32 = 0;
vector<unsigned> num;
void init(int p)
{
nb32 = (p + 31) >> 5;
num.resize(nb32);
memset(num.data(), -1, nb32 << 2);
if(int d = (nb32 << 5) - p) num.back() >>= d;
}
int div10()
{
unsigned long long rem = 0;
bool zero = true;
for(int i = nb32 - 1; i >= 0; --i) {
rem <<= 32;
rem += num[i];
num[i] = rem / 10;
rem %= 10;
if(zero) {
if(num[i]) {
zero = false;
} else {
--nb32;
}
}
}
return rem;
}