Cod sursa(job #300284)

Utilizator andreivFMI - vacaroiu andrei andreiv Data 7 aprilie 2009 12:44:12
Problema Factoriale Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <stdio.h>
int j,w,nr,n,i,p,k,x;
long int exp[109][109];
 long long q[1000],r=0;

	void mul(long long int A[], int B)  
	{  
	      int i, t = 0;  
	      for (i = 1; i <= A[0] || t; i++, t /= 10)  
	              A[i] = (t += A[i] * B) % 10;  
	      A[0] = i - 1;  
	}  

 
int main()
{
//exp[nrdescompus,divizorul]

freopen("factoriale.in","r",stdin);
freopen("factoriale.out","w",stdout);
scanf("%d %d",&n,&k);
for (i=2;i<=97;i++)
{ if (exp[i][1]==0)
    for (p=i;p<=100;p++)
      { for (x=p,w=0;x%i==0;) {x=x/i;w++;}
        exp[p][i]=exp[p-1][i]+w;if (w!=0) exp[p][1]=1;
        //aici construiesc matricea exp unde exp[i][j]=exponentul lui j in factorial de i
	  }
  exp[i][1]=0;
}


 for (i=1;i<=n;i++) 
  {scanf("%d",&x); for (p=2;p<=x;p++) exp[0][p]+=exp[x][p];}//citesc numerele si retin in exp[0][p] suma exponentilor lui p din toate factorialele nr. citite

  q[1]=1;q[0]=1;//vecorul sol
   
//inmultesc numerele de pe linia 0 a exp care %k!=0

 for (i=2;i<=97;i++) 
 {exp[0][i]=exp[0][i]%k; //in exp[0][i] ramane  (exponentului lui i) % k
    if (exp[0][i]!=0) 
	for (p=exp[0][i]+1;p<=k;p++) 
		
		{ mul(q,i);
		/*	r=0; for (j=1;j<=nr;j++) 
		       { q[j]=q[j]*i+r; r=q[j]/10;q[j]=q[j] % 10;  }
          for (;r;) {nr++;q[nr]=r%10;r/=10;}*/
		}
  }
 
  for (i=q[0];i>=1;i--) printf("%lld",q[i]);
return 0;}