Submission #50024037


Source Code Expand

#include <stdio.h>
#include <inttypes.h>

char N[32];

int mod;
int memo_mod[32][2][10 * 32][10 * 32];
uint64_t memo[32][2][10 * 32][10 * 32];

uint64_t calc(int pos, int sati, int sum_mod, int digit_sum) {
	uint64_t ans = 0;
	int limit, i;
	if (N[pos] == '\0') return sum_mod == 0 && digit_sum == mod;
	if (digit_sum > mod) return 0;
	if (memo_mod[pos][sati][sum_mod][digit_sum] == mod) {
		return memo[pos][sati][sum_mod][digit_sum];
	}
	limit = sati ? N[pos] - '0' : 9;
	for (i = 0; i <= limit; i++) {
		ans += calc(pos + 1, sati && i == limit, (sum_mod * 10 + i) % mod, digit_sum + i);
	}
	memo[pos][sati][sum_mod][digit_sum] = ans;
	memo_mod[pos][sati][sum_mod][digit_sum] = mod;
	return ans;
}

int main(void) {
	int i;
	int max = 0;
	uint64_t ans = 0;
	if (scanf("%31s", N) != 1) return 1;
	for (i = 0; N[i] != '\0'; i++) max += 9;
	for (i = 1; i <= max; i++) {
		mod = i;
		ans += calc(0, 1, 0, 0);
	}
	printf("%" PRIu64 "\n", ans);
	return 0;
}

Submission Info

Submission Time
Task E - Digit Sum Divisible
User mikecat
Language C (gcc 12.2.0)
Score 525
Code Size 993 Byte
Status AC
Exec Time 224 ms
Memory 10884 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 525 / 525
Status
AC × 3
AC × 9
Set Name Test Cases
Sample 00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt
All 00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt, 01_random_00.txt, 01_random_01.txt, 02_max_00.txt, 02_max_01.txt, 03_min_00.txt, 04_corner_00.txt
Case Name Status Exec Time Memory
00_sample_00.txt AC 1 ms 1752 KiB
00_sample_01.txt AC 1 ms 1980 KiB
00_sample_02.txt AC 44 ms 5924 KiB
01_random_00.txt AC 187 ms 10412 KiB
01_random_01.txt AC 174 ms 9864 KiB
02_max_00.txt AC 224 ms 10884 KiB
02_max_01.txt AC 190 ms 9792 KiB
03_min_00.txt AC 0 ms 1732 KiB
04_corner_00.txt AC 27 ms 4916 KiB