fbpx

Problema #686 – grad – Rezolvari PBInfo

de Mihai-Alexandru

Se consideră o propoziţie formată din litere mici ale alfabetului englez şi eventual spaţii. Cuvintele sunt formate numai din litere şi sunt separate între ele prin unul sau mai multe spaţii.

Definim numărul asociat unui cuvânt c1c2...ck ca fiind un număr natural nc, obţinut ca produsul puterilor de forma pi, unde p este poziţia în alfabet a literei ci. Astfel cuvântului badab i se asociază numărul nc=21∙12∙43∙14∙25, adică nc=4096.

Definim gradul unui cuvânt c1c2...ck ca fiind numărul nr modulo k, unde nr este numărul de divizori al lui nc. Gradul cuvântului badab este 3, pentru că nr=13 (cei 13 divizori ai lui 4096 sunt: 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048 şi 4096), k=5 (cuvântul conţine 5 litere) şi 13 modulo 5=3.

Definim gradul unei propoziţii ca fiind suma gradelor cuvintelor existente în ea.

Cerința

Să se scrie un program care pentru o propoziţie dată determină gradul ei.

Date de intrare

Fişierul de intrare grad.in va conţine pe prima linie o propoziţie.

Date de ieșire

Fişierul de ieşire grad.out va conţine pe prima linie gradul propoziţiei.

Restricții și precizări

  • Propoziţia are cel mult 255 de caractere.
  • Propoziţia începe şi se termină cu literă, şi este urmată de sfârşit de linie.
  • n modulo k înseamnă restul împărţirii lui n la k.
  • În alfabet litera a este pe poziţia 1, b este pe poziţia 2, şi aşa mai departe.

Exemplu

grad.in

de   badab

grad.out

4

Explicație

Gradul cuvântului de este 1, iar gradul cuvântului badab este 3, deci gradul propoziţiei citite va fi 1+3=4.

#include <bits/stdc++.h>

using namespace std;

ifstream cin("grad.in");
ofstream cout("grad.out");

char s[256];

int grad(char s[])
{
    int k = strlen(s);
    int div[27] = {0} , g = 1;
    for(int i = 1 ; i <= k ; i++)
    {
        int n = s[i - 1] - 'a' + 1;
        int d = 2;
        while(n > 1)
        {
            int p = 0;
            while(n % d == 0) p++ , n /= d;
            if(p)
            {
                p *= i;
                div[d] += p;
                //cout << d << " " << p << endl;
            }
            d++;
        }
    }
    //for(int i = 1 ; i <= 26 ; i++)
        //cout << div[i] << endl;
    for(int i = 1 ; i <= 26 ; i++)
        g = g * (div[i] + 1) % k;
        //cout << g << endl;
    return g;
}

int main()
{
    char s[256] , *p;
    cin.getline(s , 256);
    int g = 0;
    p = strtok(s , " ");
    while(p != 0)
    {
        g += grad(p);
        p = strtok(NULL , " ");
    }
    cout << g;
    return 0;
}
Comentarii

S-ar putea sa iti placa