Top.Mail.Ru
Ответы
Аватар пользователя
Аватар пользователя
Аватар пользователя
Аватар пользователя
Программирование
+4

Решите задачу на с++, или хотя бы скажите идею как это вообще решать.

На день рождения Ntarsis получил два целых числа n и k . Он задался вопросом, сколько фибоначчи-подобных последовательностей длины k можно сформировать таким образом, чтобы n было k -м элементом последовательности. Последовательность неубывающих неотрицательных целых чисел считается фибоначчи-подобной, если fi=fi−1+fi−2 для всех i>2 , где fi обозначает i -й элемент последовательности. Обратите внимание, что f1 и f2 могут быть произвольными. Например, последовательности [4,5,9,14] и [0,1,1] считаются допустимыми, в то время как [0,0,0,1,1] , [−1,−1,−2] и [1,2,1,3] — нет. Произведите впечатление на Ntarsis, оказав ему помощь в решении этой задачи. Входные данные Каждый тест состоит из нескольких наборов входных данных. В первой строке находится одно целое число t (1≤t≤2⋅105 ) — количество наборов входных данных. Далее следует описание наборов входных данных. Единственная строка каждого набора входных данных содержит два целых числа n и k (1≤n≤2⋅105 , 3≤k≤109 ). Гарантируется, что сумма n по всем наборам входных данных не превышает 2⋅105 . Выходные данные Для каждого набора входных данных выведите одно число — количество допустимых фибоначчи-подобных последовательностей длины k , в которых k -м элементом является n . Иными словами, выведите количество последовательностей f из k элементов таких, что f — фибоначчи-подобная, и fk=n . Можно показать, что это число конечно.
входные данные
8
22 4
3 9
55 11
42069 6
69420 4
69 1434
1 3
1 4
выходные данные
4
0
1
1052
11571
0
1
0
Примечание Для n=22 , k=4 существует 4 допустимые фибоначчи-подобные последовательности: [6,8,14,22] [4,9,13,22] [2,10,12,22] [0,11,11,22] Для n=3 , k=9 можно показать, что не существует допустимой фибоначчи-подобной последовательности, удовлетворяющей данным условиям. Для n=55 , k=11 , единственная подходящая фибоначчи-подобная последовательность это [0,1,1,2,3,5,8,13,21,34,55] . Codeforces Round 887 (Div. 2) Соревнование идет 01:51:11 Участник Добавить в избранное → Отослать? Язык: GNU G++20 11.2.0 (64 bit, winlibs) Выберите файл: Файл не выбран Обратите внимание: штраф за попытку, которая не прошла претесты, или за перепосылку составляет 50 баллов (исключения: падение на первом тесте, вердикты "Отказ тестирования" или подобные). Вердикт "Претесты пройдены" не гарантирует, что решение верное и пройдет системное тестирование. → Баллы Балл Задача A 443 Задача B 885 Задача C 1328 Задача D 1770 Задача E 2212 Задача F 2655 Успешный взлом 100 Неудачный взлом -50 Неудачная попытка -50 Перепосылка -50 * Если задача решена с первой попытки на момент 00:36

По дате
По рейтингу
Аватар пользователя
Просветленный

а ты знаешь, что жульничать во время контеста нехорошо?)
в итоге вместо того, чтобы самостоятельно подумать над нормальным решением, ты потратил время на дурачка с нейросеткой, вот и будет тебе урок на будущее

предлагаю самостоятельно решить следующую задачу: даны целые неотрицательные a, b, c, научиться находить количество целых неотрицательных решений ax+by=c
исходная задача сводится к этой

Аватар пользователя
Оракул

Один из способов решения этой задачи - это использование динамического программирования. Мы можем начать с k-го элемента и двигаться назад, вычисляя все возможные значения для каждого элемента. Для каждого элемента fi, мы можем вычислить fi-1 и fi-2 как fk - fk-1 и fk-1 - fk-2 соответственно. Если оба значения неотрицательны, мы продолжаем вычисление для следующего элемента. Если мы достигнем f1 и f2, мы увеличиваем счетчик на 1.

Вот пример кода на C++ для решения этой задачи:

1234567891011121314151617181920212223242526
 #include<bits/stdc++.h> 
using namespace std; 
#define int long long 
int t,n,k; 
signed main(){ 
    cin>>t; 
    while(t--){ 
        cin>>n>>k; 
        int ans=0; 
        for(int i=0;i<=n;i++){ 
            int j=n-i,f=1; 
            for(int l=k;l>=3;l--){ 
                if(i<0||j<0){ 
                    f=0; 
                    break; 
                } 
                int tmp=i; 
                i=j-i; 
                j=tmp; 
            } 
            if(f&&i>=0&&j>=0)ans++; 
        } 
        cout<<ans<<endl; 
    } 
}