Вывод последних k цифр искомого количества последовательностей - C#
Формулировка задачи:
Никак не могу понять как решить данную задачу. Если сказать точнее, я не понимаю как она должна работать. Мне не очень понятно как формируются выходные данные, и если бы кто нибудь сказал мне как например сформировалась тройка в первом примере, и почему во втором примере на выходе 1, я бы все понял. Спасибо!
Решая задачу по информатике, Вова в очередной раз допустил ошибку. Он снова вывел в выходной файл числа, забыв разделить их пробелами. Увидев полученный результат, Вова сначала огорчился, а потом задумался над следующим вопросом: сколько существует различных последовательностей неотрицательных целых чисел, таких что, если выписать их без пробелов, то получится тот же результат, что и у него. Он вспомнил также, что его программа смогла вывести не произвольные числа, а только те, что не превосходят C и не имеют ведущих нулей.
Чтобы ответить на поставленный вопрос, Вова решил написать программу, которая позволит ему найти число различных последовательностей неотрицательных целых чисел, в каждой из которых любое число не превосходит C. Он понимал, что такое число могло быть достаточно большим, поэтому ограничился поиском только последних k цифр этого числа.
Требуется написать программу, которая покажет Вове, как можно правильно решить поставленную им задачу.
Входные данные
Первая строка входного файла содержит три целых числа — n, C и k (1 ≤ n ≤ 50000, 1 ≤ C ≤ 10^8, 1 ≤ k ≤ 18). Во второй строке этого файла содержится результат работы Вовиной программы, состоящий из n цифр.
Выходные данные
В выходной файл выведите последние k цифр искомого количества последовательностей (без ведущих нулей).
входные данные
3 11 2
111
выходные данные
3
входные данные
19 9 1
0123456789876543210
выходные данные
1
входные данные
1 8 3
9
выходные данные
0
Решение задачи: «Вывод последних k цифр искомого количества последовательностей»
textual
Листинг программы
- using System;
- using System.IO;
- using System.Linq;
- class Program
- {
- static int Solve(int n, int c, int k, int[] seq)
- {
- k = (int)Math.Pow(10, k);
- int[] a = new int[n];
- int[] b = new int[n];
- for (int i = n - 1; i >= 0; i--)
- {
- if (seq[i] == 0) a[i] = 1;
- else
- for (int x = 0, j = i; j < n && x <= c; j++)
- {
- x = x * 10 + seq[j];
- if (x <= c) a[i]++;
- }
- if (i + a[i] >= n) b[i] = 1;
- for (int j = i + 1; j < i + a[i] + 1 && j < n; j++)
- b[i] = (b[i] + b[j]) % k;
- }
- return b[0];
- }
- static void Main()
- {
- var input = File.ReadAllLines("input.txt");
- var nck = input[0].Split().Take(3).Select(x => int.Parse(x)).ToArray();
- var seq = input[1].Select(x => x - '0').ToArray();
- var slv = Solve(nck[0], nck[1], nck[2], seq);
- File.WriteAllText("output.txt", slv.ToString());
- }
- }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д