Cod sursa(job #1850499)

Utilizator GinguIonutGinguIonut GinguIonut Data 18 ianuarie 2017 18:23:47
Problema Ridicare la putere in timp logaritmic Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <fstream>
#include <string.h>

#define nMax 100001
#define primeMax 10001

using namespace std;

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

int n, Mod, nrPrime;
int viz[nMax], prime[primeMax];
bool ciur[nMax];

void sieve()
{
    for(int i=2; i<=n; i++)
    {
        if(ciur[i]==0)
        {
            prime[++nrPrime]=i;
            for(int j=i+i; j<=n; j+=i)
                ciur[j]=1;
        }
    }
}

void decompose(int nr, int op)
{
    while(nr!=1)
    {
        for(int i=1; i<=nrPrime && nr!=1; i++)
        {
            while(nr%prime[i]==0 && nr!=1)
            {
                nr/=prime[i];
                switch(op)
                {
                    case 0: viz[prime[i]]++; break;
                    case 1: viz[prime[i]]--;
                }
            }
        }
    }
}

int check()
{
    for(int i=1; i<=nrPrime; i++)
        if(viz[prime[i]]<0)
            return 0;
    return 1;
}

void solve()
{
    int Sol=0;
    if(Mod==1)
        Sol++;
    decompose(Mod, 1);
    for(int k=1; k<=n; k++)
    {
        decompose(n-k+1, 0);
        decompose(k, 1);
        Sol+=check();
    }

    fout<<Sol;
}

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

    sieve();
    solve();
}