Cod sursa(job #2500475)

Utilizator DanutAldeaDanut Aldea DanutAldea Data 28 noiembrie 2019 00:25:39
Problema Pascal Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.3 kb
#include <fstream>
#include <iostream>
using namespace std;

ifstream fin("pascal.in");
ofstream fout("pascal.out");

int n,m,d,fact[6][5000001],i,j,jum,e2,e3,e5,cnt;

int main(){
    fin>>n>>d;
    if(d==1){
        fout<<n;
        return 0;
    }

    ///calculam fact[n]

    for(i=2;i<=n;i*=2)
        fact[2][n]+=n/i;
    for(i=3;i<=n;i*=3)
        fact[3][n]+=n/i;
    for(i=5;i<=n;i*=5)
        fact[5][n]+=n/i;

    m=n/2+n%2;
    for(i=2;i<n;i++){
        j=i;
        e2=e3=e5=0;

        while(j%2==0)
            e2++,j/=2;
        while(j%3==0)
            e3++,j/=3;
        while(j%5==0)
            e5++,j/=5;

        fact[2][i]=fact[2][i-1]+e2;
        fact[3][i]=fact[3][i-1]+e3;
        fact[5][i]=fact[5][i-1]+e5;
    }
    cout<<"*";


    /// linia n coloana i
    if(d==2){
        for(i=1;i<=n/2;i++){
            if(fact[2][n]-fact[2][i]-fact[2][n-i]>0)
                cnt+=2;
        }

        i--;
        if(n%2==0){
            if(fact[2][n]-fact[2][i]-fact[2][n-i]>0)
                cnt--;
        }
    }

    if(d==3){
        for(i=1;i<=n/2;i++){
            if(fact[3][n]-fact[3][i]-fact[3][n-i]>0)
                cnt+=2;
        }

        i--;
        if(n%2==0){
            if(fact[3][n]-fact[3][i]-fact[3][n-i]>0)
                cnt--;
        }
    }

    if(d==5){
        for(i=1;i<=n/2;i++){
            if(fact[5][n]-fact[5][i]-fact[5][n-i]>0)
                cnt+=2;
        }

        i--;
        if(n%2==0){
            if(fact[5][n]-fact[5][i]-fact[5][n-i]>0)
                cnt--;
        }
    }

    if(d==4){
        for(i=1;i<=n/2;i++){
            if(fact[2][n]-fact[2][i]-fact[2][n-i]>1)
                cnt+=2;
        }

        i--;
        if(n%2==0){
            if(fact[2][n]-fact[2][i]-fact[2][n-i]>1)
                cnt--;
        }
    }

    if(d==6){
        for(i=1;i<=n/2;i++){
            if(fact[2][n]-fact[2][i]-fact[2][n-i]>0 && fact[3][n]-fact[3][i]-fact[3][n-i]>0)
                cnt+=2;
        }

        i--;
        if(n%2==0){
            if(fact[2][n]-fact[2][i]-fact[2][n-i]>0 && fact[3][n]-fact[3][i]-fact[3][n-i]>0)
                cnt--;
        }
    }

    for(i=1;i<=n;i++)
        cout<<fact[2][i]<<" ";

    fout<<cnt;

    return 0;
}