提出 #50024037


ソースコード 拡げる

Copy
#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);
}
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
#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;
}

提出情報

提出日時
問題 E - Digit Sum Divisible
ユーザ mikecat
言語 C (gcc 12.2.0)
得点 525
コード長 993 Byte
結果 AC
実行時間 224 ms
メモリ 10884 KB

ジャッジ結果

セット名 Sample All
得点 / 配点 0 / 0 525 / 525
結果
AC × 3
AC × 9
セット名 テストケース
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
ケース名 結果 実行時間 メモリ
00_sample_00.txt AC 1 ms 1752 KB
00_sample_01.txt AC 1 ms 1980 KB
00_sample_02.txt AC 44 ms 5924 KB
01_random_00.txt AC 187 ms 10412 KB
01_random_01.txt AC 174 ms 9864 KB
02_max_00.txt AC 224 ms 10884 KB
02_max_01.txt AC 190 ms 9792 KB
03_min_00.txt AC 0 ms 1732 KB
04_corner_00.txt AC 27 ms 4916 KB


2024-02-04 (日)
22:40:54 +00:00