Pagini recente » Cod sursa (job #2438066) | Cod sursa (job #1700451) | Cod sursa (job #1396296) | Cod sursa (job #2214041) | Cod sursa (job #59196)
Cod sursa(job #59196)
using namespace std;
#include<stdio.h>
#include<cmath>
#include<fstream>
#define limdiv 10
FILE *fin=fopen("pascal.in","r"),
*fout=fopen("pascal.out","w");
int n,lim,i,j,dd;
int m;
int sol;
struct desc
{
int n;
int p;
};
desc d[limdiv];
int nr[limdiv];
void descomp()
{
int vl,m1;
memset(d,0,sizeof(d));
j=0;
i=2;
m1=dd;
while (m1!=1 && i<=dd)
if (m1%i==0)
{
vl=0;
while (m1%i==0)
{ vl++; m1/=i; }
j++;
d[j].n=i;
d[j].p=vl;
} else i++;
if (m1!=1) { d[++j].n=m1; d[j].p=1; }
lim=j;
}
int get_on()
{
int i,k;
k=0;
for (i=1; i<=lim; i++)
if (nr[i]<d[i].p) { k=1; break; }
return k;
}
void solve()
{
int i,k,up,down;
memset(nr,0,sizeof(nr));
for (k=0; k<=n/2-1; k++)
{
up=n-k;
down=k+1;
for (i=1; i<=lim; i++)
if (up%d[i].n==0)
while (up%d[i].n==0) { nr[i]++; up/=d[i].n; }
for (i=1; i<=lim; i++)
if (down%d[i].n==0)
while (down%d[i].n==0) { nr[i]--; down/=d[i].n; }
if ((get_on()==0) && (k<n/2-1) && ((n+1) % 2==1)) sol+=2;
if ((get_on()==0) && (k<n/2) && ((n+1) % 2==0)) sol+=2;
if ((get_on()==0) && (k==n/2-1) && ((n+1)%2==1)) sol++;
}
}
int main()
{
fscanf(fin,"%d%d",&n,&dd);
if (n==0 && dd==1){ fprintf(fout,"%d",1); return 0; }
else if (n==0) {fprintf(fout,"%d",0); return 0; }
descomp();
if (dd==1) { fprintf(fout,"%d",n+1); return 0; }
else solve();
fprintf(fout,"%d\n",sol);
fclose(fin);
fclose(fout);
return 0;
}