Задача. Пусть [latex]a_{1}=b_{1}=1; a_{k}=3b_{k-1}+2a_{k-1}; b_{k}=2a_{k-1}+b_{k-1}[/latex], [latex]k=\overline{2, \infty }[/latex]. Дано натуральное [latex]n[/latex]. Найти [latex]\sum_{i=1}^{n}\frac{2^{k}}{(1+a_{k}^{2}+b_{k}^{2})k!}[/latex].
Тесты:
n | [latex]\sum_{i=1}^{n}\frac{2^{k}}{(1+a_{k}^{2}+b_{k}^{2})k!}[/latex] | Комментарий |
2 |
0.0596538 |
Пройден |
4 |
0.0597339 |
Пройден |
20 | 0.059734 | Пройден |
Код:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#include <iostream> #include <math.h> using namespace std; int main() { int n, a=1, as=a, b=1; double S=0.0, u=2.0; cin >> n; for(int i=1, k=2; i<=n; i++, k++) { a=3*b+2*a; b=2*as+b; u*=(2.0/k); S+=u*(1.0/(1+a*a+b*b)); as=a; //запоминание переменной а } printf("%7lf", S); return 0; } |
Для решения данной задачи понадобилось ввести переменную [latex]n[/latex], которая показывает какое количество раз нужно повторить операцию сложения. В цикле for вычисляется сумма, по заданной формуле. Далее последовательность можно задать рекурентно: чтобы каждый раз не считать [latex]\frac{2^{k}}{k!}[/latex], мы заводим переменную u, равную изначально двум, потому что k начинается с 2, и u каждый раз мы будем домножать на [latex]\frac{2}{k}[/latex]. Далее остается лишь посчитать a и b (переменная [latex]as[/latex] запоминает переменную [latex]a[/latex] для последующего вычисления переменной [latex]b[/latex]) и поставить в формулу. Для проверки выполнения программы можно воспользоваться ссылкой.
Решение на Java:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
import java.util.*; import java.lang.*; import java.io.*; class Ideone { public static void main (String[] args) throws java.lang.Exception { Scanner in = new Scanner(System.in); int n, a=1, as=a, b=1; double sum=0.0, u=2.0; n = in.nextInt(); for(int i=1, k=2; i<=n; i++, k++) { a=3*b+2*a; b=2*as+b; u*=(2.0/k); sum+=u*(1.0/(1+a*a+b*b)); as=a; } System.out.printf(Locale.US, "%.8f", sum); } } |
Реализация не оптимальна с точки зрения переполнения.
Лучше всего выражение 2^k / k! накапливать в отдельной переменной. Тогда довольно большие 2^k и k! будут взаимоуничтожаться, насколько это возможно.
Точно!
Нужно просто домножать на 2/k. Мы рассматривали это на лекциях. Да и на матане было — переход к рекуррентному заданию последовательности.
— И ещё правильные отступы 🙂
Исправила
Ой, как-то все пропустили факт того, что в Абрамове ошибка — сумма по i, а в формуле k. Поэтому условие некорректное — а значит, что решается непонятно. Вы почему-то положили, что в данной формуле k=i+1 (i — начинается с 1, k с двойки). В этом предположении все решено верно.
В общем, т.к. некорректность условия выяснена только сейчас, то засчитаю решение. За октябрьскую работу сделанную в ноябре ставлю 8 баллов.
Засчитано, 5 баллов.