L.Digit sum (2019上海网络赛)

题目连接

    题意 :
            S_{b} =(N) 把N的十进制转换为  b 进制,然后每位相加 S_{10}(233) = 2 + 3 + 3 = 8

            S_{2}(8)=1 + 0 + 0 = 1, S_{2}(7)=1 + 1 + 1 = 3
            求    \sum_{n=1}^{N} S_{b}(n)

   思路:

        1)时间限制 2e9
             T个样例 1e5
             N 1e6
             2<=b <= 10  

        2)如果我每次都求 , 时间复杂度 (T * N * 20)(20,是进制转化消耗的时间)
        3) 应该打表 这样 T次就是O(1),然后打表需要的时间 O(9 * 20 * N)2e8就行了 + 上 查询操作是 1e5。
        4)然后开个二维数组存每数个之前的b进制 的和(前缀和) 

AC:

#include<iostream>
#include<cstring>
#include<math.h>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn = 1e6;
ll F[11][maxn + 20]; 
//进制转换打表 
void Solve() {
	int tmp;
	for(int base = 2; base <= 10; ++base) {
		for(int i = 1; i <= maxn; ++i) {
			tmp = i;
			while(tmp) {
				F[base][i] += tmp%base;
				tmp /= base;
			}
			F[base][i] += F[base][i - 1];
		}
	} 
}
int main() {
	//freopen("inL.txt", "r", stdin);
	int N, b;
	Solve(); 
	int T, Case = 0;
	scanf("%d", &T);
	while(T--) {
		scanf("%d%d", &N, &b);
		printf("Case #%d: %lld\n", ++Case, F[b][N]);
	}
	return 0;
} 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值