Cod sursa(job #1340923)

Utilizator akaprosAna Kapros akapros Data 12 februarie 2015 10:23:58
Problema Fructe Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 kb
#include<cstdio>
#include<algorithm>
#include<cstring>
#define N 2505
#define K 505
using namespace std;
int n,m,i,j,k,a[2][K][805],v[N];
void add(int A[],int B[])
{
      int i,t=0;
      for (i=1;i<=A[0]||i<=B[0]||t;i++,t/=1000000000)
      A[i]=(t+=A[i]+B[i])%1000000000;
      A[0]=i-1;
}
int main()
{
    freopen("mult.in","r",stdin);
    freopen("mult.out","w",stdout);
    scanf("%d %d",&n,&k);
    for (i=1;i<=n;i++)
    scanf("%d",&v[i]);
    a[0][0][0]=1; a[0][0][1]=1;
    for (i=1;i<=n;i++)
    {
        for (j=0;j<k;j++)
        add(a[i%2][(j*10+v[i])%k],a[(i-1)%2][j]);
        for (j=0;j<k;j++) add(a[i%2][j],a[(i-1)%2][j]);
        memset(a[(i-1)%2],0,sizeof(a[(i-1)%2]));
    }
    i=1;
    while (a[n%2][0][i]==0) i++;
    a[n%2][0][i]-=1;
    for (i=a[n%2][0][0];i>=1;i--)
    {
        if (i==a[n%2][0][0])
        {printf("%d",a[n%2][0][i]); continue;}
        if (a[n%2][0][i]<10) printf("00000000%d",a[n%2][0][i]);
        else if (a[n%2][0][i]<100) printf("0000000%d",a[n%2][0][i]);
        else if (a[n%2][0][i]<1000) printf("000000%d",a[n%2][0][i]);
        else if (a[n%2][0][i]<10000) printf("%00000d",a[n%2][0][i]);
        else if (a[n%2][0][i]<100000) printf("%0000d",a[n%2][0][i]);
        else if (a[n%2][0][i]<1000000) printf("%000d",a[n%2][0][i]);
        else if (a[n%2][0][i]<10000000) printf("%00d",a[n%2][0][i]);
        else if (a[n%2][0][i]<100000000) printf("%0d",a[n%2][0][i]);
        else printf("%d",a[n%2][0][i]);
    }
    return 0;
}