[RC-07] 心跳 题解
Demeanor_Roy · · 题解
- 个人感觉略显套路。
考虑怎样一个数才能称作
- 当且仅当数
x 在B 进制下,去除最高位最多有一位为B-2 ,其余均为B-1 时,我们称数x 是B -好的。
证明的话考虑对每个数
对于数
-
最高位未满,显然可以直接列出式子:
ans = \frac{len(len-1)(B-1)}{2} + (m-1)len 。其中前者是位数小于len 的答案求和,后者是最高位为[1,m-1] 的答案求和。不懂的可以看 这儿。 -
最高位已满,这样的答案只有
\log 个,暴力比较是否合法即可。
时间复杂度
#include<bits/stdc++.h>
using namespace std;
#define LL long long
const int N=65;
int T;
LL n,B,now,ans,num[N];
inline void solve()
{
scanf("%lld%lld",&n,&B);
now=0;
while(n) num[++now]=n%B,n/=B;
ans=(B-1)*now*(now-1)/2+(num[now]-1)*now;
for(int i=now-1;i>=1;i--)
{
if(num[i]==B-1) ans+=(i==1)+1;
else if(num[i]==B-2)
{
bool flag=true;
for(int j=i-1;j>=1;j--) if(num[j]!=B-1) {flag=false;break;}
if(flag) ans++;break;
}
else break;
}
printf("%lld\n",ans+(now==1));
}
int main()
{
scanf("%d",&T);
while(T--) solve();
return 0;
}