Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/18: Рейтинг темы: голосов - 18, средняя оценка - 4.78
1505 / 968 / 812
Регистрация: 30.04.2016
Сообщений: 3,334
1

Формула подсчета перестановок

13.08.2017, 18:37. Показов 3673. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, уважаемые пользователи! На этот раз, обращаюсь к гуру комбинаторики, за простым советом. Есть вот такая несложная задача:

Анаграммы

Анаграммой слова называется любая перестановка всех букв слова. Например, из слова SOLO можно получить 12 анаграмм: SOLO, LOSO, OSLO, OLSO, OSOL, OLOS, SLOO, LSOO, OOLS, OOSL, LOOS, SOOL.

Напишите программу, которая выводит количество различных анаграмм, которые могут получиться из этого слова.

Входные данные:

Слово, количество букв в котором не превышает 14.

Выходные данные:


Количество различных анаграмм.

Входные данные:
SOLO

Выходные данные:
12

Решение этой задачи легко сводится к перебору с использованием функции next_permutation(), однако, программа в последнем тесте не проходит по времени. Помню, как на практике, решали задачки по теории вероятностей с использованием формул C(n, k) и A(n, k). Если я ничего не перепутал, то зная входные данные (типа ABCDDD - ответ 120), можно получить формулу для расчета всевозможных комбинаций, но как эта формула выглядит - не помню Например, для ABCDDD можно подсчитать длину строки (=6) и число различных символов в ней (=4) и оперируя этими цифрами получить ответ (используя специальную формулу, которую я и хочу использовать для решения задачи. Буду благодарен всем, кто сможет помочь.

Мое решение:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <bits/stdc++.h>
 
using namespace std;
 
int main()
{
    string s;
    int N;
    getline(cin, s);
    sort(s.begin(), s.end());
    N = 0;
    do
    {
        N++;
    } while (next_permutation(s.begin(), s.end()));
    cout << N << endl;
    system("pause");
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.08.2017, 18:37
Ответы с готовыми решениями:

Формула подсчета количества итераций цикла for
Доброго времени суток Помогите ответом/советом/уч. материалом Пусть, for( int i = 1; i &lt;= 10;...

Метод парных перестановок и метод подсчета
Помогите пожалуйста! задача:Переставить строки матрицы так, чтобы убывало кол-во нулей в строках....

Есть ли в java стандартное средство подсчета перестановок с повторениями?
Добрый день. Есть массив содержащий последовательность чисел, которые могут повторяться, мне надо...

Формула подсчета дисперсии
Всем доброе утро, подскажите пожалуйста, я ищу формулу, которая подсчитывает дисперсию внутри...

5
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
13.08.2017, 18:45 2
n! / k!, где n - количество знаков, а k - количество повторяющихся элементов?
1
1505 / 968 / 812
Регистрация: 30.04.2016
Сообщений: 3,334
13.08.2017, 19:25  [ТС] 3
Croessmah, да, похоже вы правы Сейчас сделаю решение и сюда выложу. Спасибо огромное!

Добавлено через 14 минут
Croessmah, а как будет для ABCCDDFF? (8! / 6!) = 40320 / 720 = 56, а должно быть 5040.

Добавлено через 19 минут
Croessmah, можете не отвечать, я понял. Тут для каждого набора символов нужно k! считать То есть, для ABCCDDFF будет: 8! / (2! * 2! * 2!), где 2 - количество вхождений (не)уникального символа
1
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
13.08.2017, 19:28 4
Цитата Сообщение от Fixer_84 Посмотреть сообщение
можете не отвечать
Ну ок.
Цитата Сообщение от Fixer_84 Посмотреть сообщение
Сейчас сделаю решение и сюда выложу.
Хоть сработало?
0
1505 / 968 / 812
Регистрация: 30.04.2016
Сообщений: 3,334
13.08.2017, 19:40  [ТС] 5
Croessmah, да, вот решение, но теперь в последнем тесте - неправильный ответ. Можете помочь? Все, вроде, правильно и по времени теперь - идеально

Решение:

C++
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
#include <bits/stdc++.h>
 
using namespace std;
 
int Fact(int N)
{
    if (N == 1)
        return 1;
    else
        return N * Fact(N - 1);
}
 
int main()
{
    string str;
    int x, y, p;
    getline(cin, str);
    sort(str.begin(), str.end());
    x = y = 0;
    p = 1;
    for (int i = y; str[i]; i++)
    {
        if (str[i] == str[i+1])
        {
            x++;
        }
        else
        {
            y = x;
            x++;
            if (x > 1)
                p *= Fact(x);
            x = 0;
        }
    }
    cout << Fact(str.size()) / p << endl;
    system("pause");
    return 0;
}
Добавлено через 3 минуты
Croessmah, все, сдал Не тот тип данных просто использовал Спасибо вам!

Рабочее решение:

C++
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
#include <bits/stdc++.h>
 
using namespace std;
 
long long Fact(int N)
{
    if (N == 1)
        return 1;
    else
        return N * Fact(N - 1);
}
 
int main()
{
    string str;
    long long x, y, p;
    getline(cin, str);
    sort(str.begin(), str.end());
    x = y = 0;
    p = 1;
    for (int i = y; str[i]; i++)
    {
        if (str[i] == str[i+1])
        {
            x++;
        }
        else
        {
            y = x;
            x++;
            p *= Fact(x);
            x = 0;
        }
    }
    cout << Fact(str.size()) / p << endl;
    system("pause");
    return 0;
}
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
13.08.2017, 20:00 6
Цитата Сообщение от Fixer_84 Посмотреть сообщение
и по времени теперь - идеально
Можно факториал "затабличить".
0
13.08.2017, 20:00
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.08.2017, 20:00
Помогаю со студенческими работами здесь

Формула подсчета суммы
Есть 4 столбца ОРЗ, Грипп, Гастрит Всего дней. Первые 3 поля обозначают количество дней за которые...

Формула подсчета суммы
есть 3 столбца. 1 семестр, 2 семестр, сумма нужно чтобы сумма считала значения, с этих 2 столбцов....

Формула подсчёта ячеек с условиями
Здравствуйте! Подскажите пожалуйста формулу,описание задачи в файле.

Не работает формула подсчета калорий
&amp;НаКлиенте Процедура ХимикоэнергетическиеХарактеристикиКоличествоПриИзменении(Элемент) ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru