题目链接:https://nanti.jisuanke.com/t/41422
思路:二维树状数组+区间求和
AC代码
#include<iostream>
using namespace std;
const int MAXN = 1000001;
int c[11][MAXN];
int calc(int n,int b)
{
int res=0;
while(n)
{
res += (n%b);
n/=b;
}
return res;
}
int lowbit(int x)
{
return x&(-x);
}
void add(int x,int y,int val)
{
while(y<MAXN)
{
c[x][y]+=val;
y+=lowbit(y);
}
}
int Sum(int x,int y)
{
int sum = 0;
while(y>0)
{
sum+=c[x][y];
y-=lowbit(y);
}
return sum;
}
void init() //将二到十进制的所有数的情况计算出来,且对每个进制建立一个树状数组
{
for(int i=2;i<=10;i++)
{
for(int j=1;j<MAXN;j++)
{
int val = calc(j,i);
add(i,j,val);
}
}
}
int main()
{
int T,id=1;
init();
scanf("%d",&T);
while(T--)
{
int n,b;
scanf("%d%d",&n,&b);
printf("Case #%d: %d\n",id++,Sum(b,n));
}
return 0;
}