# The Preliminary Contest for ICPC Asia Shanghai 2019

*****
**數字求和**
一個數字和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)的數據結構。主要用于查詢任意兩位之間的所有元素之和,
>  
*****
:-: **有該函數才有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問題
- 貪心算法
- 活動安排