Cod sursa(job #516568)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 24 decembrie 2010 19:42:24
Problema Numerele lui Stirling Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.14 kb
#include<stdio.h>
#include<math.h>
long fact(int n)
{if(n==0)
     return 1;
return n*fact(n-1);}

long s(int n,int m)
{if(n==m)
     return 1;
else
     if((n>0&&m==0)||m>n)
          return 0;
     else
          if(m==1&&n>1)
                if(n%2==0)
                         return -fact(n-1);
                else
                         return fact(n-1);
          else
                if(m==n-1&&n>6)
                       return s(n,2);
                else
                       if(m==n-2&&n>7)
                              return (3*n-1)*s(n,3)/4;
                       else
                              if(m==n-3&&n>8)
                                      return s(n,2)*s(n,4);
                              else
                                      return s(n-1,m-1)-(n-1)*s(n-1,m);}

long S(int n,int m)
{if(n==m||m==1)
     return 1;
else
     if((m==n-1&&n>2)||m==2)
          return (long)(pow(2,n-1))-1;
     else
          if(m==3&&n>3)
                return ((long)(pow(3,n-1))-(long)(pow(2,n))+1)/2;
          else
                if(m==4&&n>4)
                       return ((long)(pow(4,n-1))-(long)(pow(3,n-1))-((long)(pow(4,n-1))-(long)(pow(2,n-1)))+((long)(pow(4,n-1))-1)/3)/2;
                else
                       if(m==5&&n>5)
                              return ((long)(pow(5,n-1))-(long)(pow(4,n-1))-3*((long)(pow(5,n-1))-(long)(pow(3,n-1)))/2+(long)(pow(5,n-1))-(long)(pow(2,n-1))-((long)(pow(5,n-1))-1)/4)/6;
                       else
                              return S(n-1,m-1)+m*S(n-1,m);}

int main()
{int t,n,m,k,i;
long p;
freopen("stirling.in","r",stdin);
freopen("stirling.out","w",stdout);
scanf("%d\n",&t);
for(i=1;i<=t;i++)
      {scanf("%d%d%d",&k,&n,&m);
      if(k==1)
              {p=s(n,m);
              if(p>=98999||p<=-98999)
                     printf("%ld\n",p%98999);
              else
                     printf("%ld\n",p);}
      else
              {p=S(n,m);
              if(p>=98999)
                     printf("%ld\n",p%98999);
              else
                     printf("%ld\n",p);}}
fclose(stdin);
fclose(stdout);
return 0;}