Cod sursa(job #1735051)

Utilizator georgerapeanuRapeanu George georgerapeanu Data 28 iulie 2016 19:00:59
Problema Pascal Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.56 kb
#include <cstdio>
#include <cmath>
using namespace std;
FILE *f=fopen("pascal.in","r");
FILE *g=fopen("pascal.out","w");
long long N,M,i,rez,a,b,j;
int facprim[1005];
int expo[1005];
int P[1005];
bool ok;
int numereprime[185]={0,2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,101,103,107,109,113,127,131,137,139,149,151,157,163,167,173,179,181,191,193,197,199,211,223,227,229,233,239,241,251,257,263,269,271,277,281,283,293,307,311,313,317,331,337,347,349,353,359,367,373,379,383,389,397,401,409,419,421,431,433,439,443,449,457,461,463,467,479,487,491,499,503,509,521,523,541,547,557,563,569,571,577,587,593,599,601,607,613,617,619,631,641,643,647,653,659,661,673,677,683,691,701,709,719,727,733,739,743,751,757,761,769,773,787,797,809,811,821,823,827,829,839,853,857,859,863,877,881,883,887,907,911,919,929,937,941,947,953,967,971,977,983,991,997};
void desc()
{
    i=1;
    while(M!=1&&numereprime[i]!=0)
    {
        if(M%numereprime[i]==0)
        {
            facprim[++facprim[0]]=numereprime[i];
            while(M%numereprime[i]==0)
            {
                expo[facprim[0]]++;
                M/=numereprime[i];
            }
        }
        i++;
    }
    if(M!=1)
    {facprim[++facprim[0]]=M;expo[facprim[0]]=1;}
}
/*double A,tmpdouble,basicval;//basicaval-tine minte log(M) ca sa nu mai fie apelat
//A tine minte la ce putere este ridicat 10 ca sa dea rezultatul combinarilor la care suntem
int main()
{
    fscanf(f,"%lld %lld",&N,&M);
    if(M==1)//salveaza timp
    {fprintf(g,"%lld",N);return 0;}
    N--;//pentru N valori,coeficenti vor fi C(N-1,k),k intre 0 si N-1;
    basicval=log10(M);
    for(i=1;i<=(N-1)/2;i++)
    {
        A=A+log10(N-i+1)-log10(i);//derivata din faptul ca C(N,K)=C(N,K-1)*(N-k+1)/k
        tmpdouble=pow(10,((A/basicval)-1)*basicval);//tmpdouble stie cat este C(N,K)/M;
        if((long long)(A/basicval)>0&&((tmpdouble)-(long long)(tmpdouble)<=0.00000000000001||(long long)(tmpdouble)+1-(tmpdouble)<=0.00000000000001))
            rez+=2;
    }
    if(!(N&1))
     {
         A=A+log10(N-i+1)-log10(i);
        tmpdouble=pow(10,((A/basicval)-1)*basicval);
        if((long long)(A/basicval)>0&&((tmpdouble)-(long long)(tmpdouble)<=0.00000000000001||(long long)(tmpdouble+1)-(tmpdouble)<=0.00000000000001))
            rez++;
    }
    fprintf(g,"%lld",rez);
    fclose(f);
    fclose(g);
    return 0;

}
*/
int main()
{
    fscanf(f,"%lld %lld",&N,&M);
     if(M==1)//salveaza timp
    {fprintf(g,"%lld",N);return 0;}
    desc();
    for(i=1;i<=(N-1)/2;i++)
    {
        ok=1;
        for(j=1;j<=facprim[0];j++)
        {
            a=N-i+1;
            b=i;
            while(a%facprim[j]==0)
            {
                P[j]++;
                a/=facprim[j];
            }
            while(b%facprim[j]==0)
            {
                P[j]--;
                b/=facprim[j];
            }
            ok=ok&(P[j]>=expo[j]);
        }
        if(ok)
            rez+=2;
    }
    if(!(N&1))
    {
        ok=1;
        for(j=1;j<=facprim[0];j++)
        {
            a=N-i+1;
            b=i;
            while(a%facprim[j]==0)
            {
                P[j]++;
                a/=facprim[j];
            }
            while(b%facprim[j]==0)
            {
                P[j]--;
                b/=facprim[j];
            }
            if(P[j]<expo[j])
            {
                ok=0;
                break;
            }
        }
        if(ok)
            rez++;
    }
    fprintf(g,"%lld",rez);
    fclose(f);
    fclose(g);
}