Pagini recente » Cod sursa (job #650661) | Cod sursa (job #287157) | Cod sursa (job #343254) | Cod sursa (job #59888) | Cod sursa (job #466501)
Cod sursa(job #466501)
#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++)
{
if(!d[i][j])
continue;
ci=i;poz=0;
while(ci)
{
if(!(ci&1))
d[i+(1<<poz)][(j+p[bit[i]]*v[poz+1])%r]+=d[i][j];
ci/=2;
poz++;
}
for(poz=poz;poz<=nr;poz++)
d[i+(1<<poz)][(j+p[bit[i]]*v[poz+1])%r]+=d[i][j];
}
printf("%lld\n",d[(1<<nr)-1][0]);
return 0;
}