Pagini recente » Istoria paginii runda/leitenten | Cod sursa (job #2387918) | Cod sursa (job #1493076) | Cod sursa (job #141129) | Cod sursa (job #465741)
Cod sursa(job #465741)
#include<stdio.h>
#define ll long long
int p[23],v[23],r,nr;
ll d[(1<<18)][20];
char bit[(1<<18)+4];
int rest(int val)
{
if(val<0)
val+=r;
return val;
}
int main ()
{
ll val;
int i,j,ci,poz;
freopen("ratphu.in","r",stdin);
freopen("ratphu.out","w",stdout);
scanf("%lld%d",&val,&r);
while(val)
{
nr++;
v[nr]=val%10;
val/=10;
}
for(i=1;i<=(1<<nr);i++)
bit[i]=(i&1 ? bit[i/2]+1 : bit[i/2]);
p[0]=1;
for(i=1;i<nr;i++)
p[i]=(p[i-1]*10)%r;
for(i=0;i<nr;i++)
d[(1<<i)][(p[0]*v[i+1])%r]=1;
for(i=1;i<(1<<nr);i++)
for(j=0;j<r;j++)
{
ci=i;poz=0;
while(ci)
{
if((ci&1))
d[i][j]+=d[i-(1<<poz)][rest(j-(v[poz+1]*p[bit[i]-1])%r)];
ci/=2;
poz++;
}
}
printf("%lld\n",d[(1<<nr)-1][0]);
return 0;
}