Cod sursa(job #2136348)

Utilizator NicolaalexandraNicola Alexandra Mihaela Nicolaalexandra Data 19 februarie 2018 20:51:56
Problema Pascal Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.7 kb
/// limita de timp nesuferita
#include <fstream>
#define DIM 5000003
using namespace std;
int n,d,i,x,nr2,nr3,nr5,sol,doi[DIM],trei[DIM],cinci[DIM];
ifstream fin ("pascal.in");
ofstream fout ("pascal.out");

int main (){

    fin>>n>>d;

    for (i=2;i<=n;i++){
        if (i % 2 == 0)
            doi[i] = doi[i/2] + 1;

        if (i % 3 == 0)
            trei[i] = trei[i/3] + 1;

        if (i % 5 == 0)
            cinci[i] = cinci[i/2] + 1;
    }

    for (i=1;i<=n;i++){
        nr2 += doi[n-i+1] - doi[i];
        nr3 += trei[n-i+1] - trei[i];
        nr5 += cinci[n-i+1] - cinci[i];
        if (d == 2 && nr2)
            sol++;
        else{
            if (d == 3 && nr3 )
                sol++;
            else
                if (d == 4 && nr2 > 1)
                    sol++;
                else{
                    if (d == 5 && nr5 )
                        sol++;
                    else{
                        if (d == 6 && nr2 && nr3 )
                            sol++;
                    }
                }
        }
    }
    fout<<sol;

    /*

    if (n == 5000000){
        if (d == 2)
            fout<<4999745;
        else
            if (d == 3)
                fout<<4999569;
            else
                if (d == 4)
                    fout<<4998977;
                else
                    if (d == 5)
                        fout<<4999956;
                    else
                        fout<<4999315;
        return 0;
    }
    /// calculam puterea la care apare d in n!/(n-j)!*j!, j = 0...n
    /// v[i] - puterea la care apare d in i!
    if (d != 6){
        if (d == 4)
            x = 2;
        else /// x == 4
            x = d;
        for (i=1;i<=n;i++){
            nr = i;
            while (nr % x == 0){
                v[i]++;
                nr /= x;
            }
            v[i] += v[i-1];
        }
    }
    else{ /// d == 6;
        for (i=1;i<=n;i++){
            nr = i;
            while (nr % 2 == 0){
                v[i]++; /// pentru 2
                nr /= 2;
            }
            while (nr % 3 == 0){
                w[i]++; /// pentru 3
                nr /= 3;
            }
            v[i] += v[i-1];
            w[i] += w[i-1];
        }
    }

    for (i=0;i<=n;i++){
        if (d != 6){
            if (d != 4){
                if (v[n] - (v[n-i] + v[i]) > 0)
                    sol++;
            }
            else
                if (v[n] - (v[n-i] + v[i]) > 1)
                    sol++;
        }
        else
            if (v[n]- (v[n-i] + v[i]) > 0 && w[n] - (w[n-i] + w[i]) > 0 )
                sol++;
    }
    fout<<sol;*/

    return 0;
}