Задача
Подсчитайте количество способов, которыми можно получить сумму $n$ бросая игральный кубик один или несколько раз. Каждый бросок дает результат между 1 и 6.
Например, если $n = 3$, то имеется 4 способа:
1 + 1 + 1
1 + 2
2 + 1
3
Входные данные
Одно целое число $n$ $(1 \leqslant n \leqslant 10^6)$.
Выходные данные
Выведите количество способов по модулю $10^9+7$.
Тесты
| № | Входные данные | Выходные данные | 
| 1 | 1 | 1 | 
| 2 | 3 | 4 | 
| 3 | 5 | 16 | 
| 4 | 6 | 32 | 
| 5 | 8 | 123 | 
Код программы
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | import java.util.*; import java.lang.*; import java.io.*; import java.util.Scanner; public class Ideone { 	public static void main (String[] args) throws java.lang.Exception 	{ 		int n; 	    int ans = 0; 	    Scanner myObj = new Scanner(System.in); 	    n = myObj.nextInt(); //считываем сумму, для которой будем считать количество перестановок 	    int a[] = new int[n+1]; //создаем массив 	    Arrays.fill(a, 0); 	    if (n == 1) ans = 1; 	    if (n == 2) ans = 2; 	    if (n == 3) ans = 4; 	    if (n == 4) ans = 8; 	    if (n == 5) ans = 16; 	    if (n == 6) ans = 32; 	    // частные случаи 	    if (n > 6) 	    { 	        a[1] = 1;  	        a[2] = 2;  	        a[3] = 4;  	        a[4] = 8; 	        a[5] = 16;  	        a[6] = 32;  	        for (int i = 7; i < n + 1; i++) 	        { 	            a[i]=0; 	            for (int j = 1; j < 7; j++) // вычисление количества для i-ой суммы 	                a[i] = ( a[i] + a[i-j] ) % 1000000007; 	        } 	        ans = a[n]; 	    } 	    System.out.println(ans); 	} } | 
Решение
Создадим массив на $n+1$ элемент. В который мы сразу запишем количество перестановок для сумм 1,2..,6. Для остальных случаев, когда $n>7$ воспользуемся следующей идеей. Будем вычислять количество перестановок для сумм, начиная с 7 до тех пор, пока не дойдем до заданного нам $n$. Будем делать это по такой формуле $a_{i}=a_{i-1}+a_{i-2}+a_{i-3}+a_{i-4}+a_{i-5}+a_{i-6}$ . Для первых шести сумм вычисляем по этой же формуле, с учетом, что $0 < i-k \; (1 \leqslant k \leqslant 6)$ и добавляя еще 1 перестановку, так как мы можем получить сумму ( $i$ ), подбросив кубик 1 раз. Рассмотрим для $n=7$. Чтобы получить 7 достаточно подбросить кубик ещё один раз, так как мы знаем количество для $n$ от 1 до 6. Если выпадет 1, то остается $a_{6}$ возможных перестановок, если выпадет 2, то остается $a_{5}$ и так далее. Затем нам требуется просуммировать, так как кубик может выпасть 6 способами, как было сказано ранее. Соответственно для $n=8$ количество комбинаций увеличится на $a_{7}$ и уменьшится на $a_{1}$, так как кубик имеет только 6 граней.
Ссылки
Условие задачи на e-olymp
Код программы на ideone
