# The Preliminary Contest for ICPC Asia Shanghai 2019
![](https://img.kancloud.cn/7d/39/7d39eb01ccff7bcc9074bb2e5abde46f_672x712.png)
*****
**数字求和**
一个数字和S (n)是n的b进制数字的和,如S10(233)=2+3+3=8,S2(8)= 1+0+0= 1,S2(7)=1+1+1=3。
给定N和b,你需要计算Sb(n)~ (N)的值。
**输入**
输入的第一行给出了测试用例的数量,接下来是T 测试用例。每个测试用例都以包含两个整数N和b的行开始。
**输出**
对于每个测试用例,输出一行包含*Case#x: y*,其中x是测试用例号(从1开始),y是答案。
:-: **求得每个数对应b进制时,各个位数上的数字相加之和。**
```
int calc(int n,int b)
{
int res=0;
while(n)
{
res += (n%b);
n/=b;
}
return res;
}
```
*****
```
for(int i=1;i<=N;i++)
{
sum = cal(b,i);
}
```
#### [树状数组](https://baike.so.com/doc/7865826-8139921.html)的扩展。
> 树状数组是一个查询和修改复杂度都为log(n)的数据结构。主要用于查询任意两位之间的所有元素之和,
> ![](https://img.kancloud.cn/73/cb/73cbaab8a594a9963d302bdf37216dbd_270x173.png) ![](https://img.kancloud.cn/f6/bf/f6bfb58fd9712960b6119f79caf33a12_220x354.png)
*****
:-: **有该函数才有y的二进制数的lowbit()操作的实现。**
```
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);//y的二进制数+1的操作
}
}
int Sum(int x,int y)
{
int sum = 0;
while(y>0)
{
sum+=c[x][y];
y-=lowbit(y);//y的二进制数-1的操作
}
return sum;
}//将c[x][y]进行一次相加,直到所有数值相加完成
```
*****
```
const int MAXN = 1000001;
int c[11][MAXN];
```
*****
```
#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;
}//求得每个数对应b进制时,各个位数上的数字相加之和。
int lowbit(int x)
{
return x&(-x);
}//有该函数才有y的二进制数的lowbit()操作的实现。
void add(int x,int y,int val)
{
while(y<MAXN)
{
c[x][y]+=val;
y+=lowbit(y);//y的二进制数+1的操作
}
}
int Sum(int x,int y)
{
int sum = 0;
while(y>0)
{
sum+=c[x][y];
y-=lowbit(y);//y的二进制数-1的操作
}
return sum;
}//将c[x][y]进行一次相加,直到所有数值相加完成
void init()
{//将二到十进制的所有数的情况计算出来,且对每个进制建立一个树状数组
for(int i=2;i<=10;i++)
{
for(int j=1;j<MAXN;j++)
{
int val = calc(j,i);//将cal函数求得的和赋予val
add(i,j,val);//对应1到n的数,各位的val值赋予未定义的c[b][n]
}
}
}
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;
}
```
- 蓝桥杯
- 问题 1434[蓝桥杯][历届试题]回文数字
- 问题 1084: 用筛法求之N内的素数。 时间限制: 1Sec 内存限制: 64MB
- 问题 1094: 字符串的输入输出处理 时间限制: 1Sec 内存限制: 64MB
- A + B Problem II(1002)
- ACM
- L. Digit sum--The Preliminary Contest for ICPC Asia Shanghai 2019
- 单链表逆置法
- 有线性表(a1,a2,…,an),采用单链表存储,头指针为H,每个结点中存放线性表中一个元素,现查找某个元素值等于X的结点。分别写出下面三种情况的查找语句。要求时间尽量少。 (1)线性表中元素无序。(2)线性表中元素按递增有序。 (3)线性表中元素按递减有序。
- 减治法
- 减治法之堆运算
- 减治法之求两序列中位数
- 减治法之求第k小的数字
- 选择问题考研题
- 动态规划
- 动态规划之最长公共子序列
- 最大总和(1003)
- 数塔问题
- 动态规划之最大子段和
- 丢鸡蛋
- 0-1背包问题
- TSP问题
- 贪心算法
- 活动安排