L. Digit sum (ICPC 2019 上海網絡賽)

題目鏈接: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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章