Mai intai trebuie sa te autentifici.
Cod sursa(job #195440)
Utilizator | Data | 18 iunie 2008 16:32:37 | |
---|---|---|---|
Problema | Pascal | Scor | 80 |
Compilator | cpp | Status | done |
Runda | Arhiva de probleme | Marime | 2.08 kb |
#include<stdio.h>
int r,d,rez,lim;
int doi[]={2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072,262144,524288,1048576,2097152,4194304,8388608};
int trei[]={3,9,27,81,243,729,2187,6561,19683,59049,177147,531441,1594323,4782969,14348907};
int cinci[]={5,25,125,625,3125,15625,78125,390625,1953125,9765625};
int *n;
int calc(int x)
{
int k=0,i;
for(i=0; n[i]<=x; i++)
k+=x/n[i];
return k;
}
void rezolva()
{
int k,i,k1=0,g1,g2,k2,k3,d1=d-1;
k=calc(r);
lim=r/2+1;
if(!(r&1))
lim--;
g1=1;
g2=r%d;
k2=calc(r-1);
k3=k2;
for(i=1; i<lim; i++)
{
if(!g1)
{
k3-=k1;
k1=calc(i);
k3+=k1;
}
else
{
if(g1==d1)
g1=0;
else
g1++;
}
if(!g2)
{
k3-=k2;
k2=calc(r-i);
k3+=k2;
}
else
{
if(g2==0)
g2=d1;
else
g2--;
}
if(k!=k3)
rez+=2;
}
if(!(r&1))
{
k1=calc(i);
k1+=calc(r-i);
if(k!=k1)
rez++;
}
}
void rezolva4()
{
int k,i,k1;
n=doi;
k=calc(r);
lim=r/2+1;
if(!(r&1))
lim--;
for(i=1; i<lim; i++)
{
k1=calc(i);
k1+=calc(r-i);
k1=k-k1;
k1>>=1;
if(k1)
rez+=2;
}
if(!(r&1))
{
k1=calc(i);
k1+=calc(r-i);
k1=k-k1;
k1>>=1;
if(k1)
rez++;
}
}
void rezolva6()
{
int k2,i,k1,k3;
n=doi;
k2=calc(r);
n=trei;
k3=calc(r);
lim=r/2+1;
if(!(r&1))
lim--;
for(i=1; i<lim; i++)
{
n=trei;
k1=calc(i);
k1+=calc(r-i);
if(k3!=k1)
{
n=doi;
k1=calc(i);
k1+=calc(r-i);
if(k2!=k1)
rez+=2;
}
}
if(!(r&1))
{
n=trei;
k1=calc(i);
k1+=calc(r-i);
if(k3!=k1)
{
n=doi;
k1=calc(i);
k1+=calc(r-i);
if(k2!=k1)
rez++;
}
}
}
int main()
{
freopen("pascal.in","r",stdin);
freopen("pascal.out","w",stdout);
scanf("%d%d",&r,&d);
if((r==0)||(r==1))
{
printf("0\n");
return 0;
}
switch(d)
{
case 2: {n=doi; rezolva();} break;
case 3: {n=trei; rezolva();} break;
case 4: rezolva4(); break;
case 5: {n=cinci; rezolva();} break;
case 6: rezolva6(); break;
}
printf("%d\n",rez);
return 0;
}