piątek, 6 stycznia 2012

Partycje

#include <stdio.h>
 
void denew(int B, int * N, int * K){
        int n,k,i,b;
        for( n=1; n<B; n++ ){
                b=i=n;
                for( k=2; 2*k<=n;  k++ ) {
                        b = b*(--i)/k;
                        if( b==B ) {
                                *N= n; *K= k; return; }
                        if( b>B ) break;
                }
        }
        *N=B; *K=1;
}
#define MAX 20
 
int  n,k,licznik=0,wsie=0;
int  p[MAX+2];
 
int min( int x, int y) { return x<y ? x : y;}
 
long long int silnia(int n){
   long long int s=1;
   while(n) s*=n--; return s;}
   
void PrintIt(int t, int z) {
   if( z>0 && t!=z) return;
   int i,pop; long long int perm;
   printf("%3d, %3d  | ", ++licznik, t);
   p[t+1]=0; pop=1; perm=silnia(t); 
   for(i=1; i<=t; i++){
       if(p[i]!=p[pop]){
           perm/=silnia(i-pop);
           pop=i;} 
       printf("%2d ", p[i]);}
   perm/=silnia(i-pop);
   while(i++<23) printf("   "); printf(" %20llu\n", perm);
   wsie+=perm;}
 
void P (int n, int k, int t, int z) {
   int j;
   p[t] = k;
   if (n==k) 
       PrintIt(t, z);
   for (j=min(k,n-k); j>=1; j--) 
       P(n-k,j,t+1,z);}
 
int main() {
   int i, z ,d;
   scanf("%d %d",&i, &z);
   P(i*2, i, 0, z);
   for(i=1;i<23;i++) printf("   ");
   denew(wsie, &i, &z);
   printf("Wszystkich do kupy %14d=newton(%d,%d)\n", wsie, i, z);
   z=wsie & (-wsie);
   if( z== wsie){
      for(i=1;i<23;i++) printf("   ");
      i=1; z=2;
      while( z != wsie) {
         i++; z*=2; }
   printf("                                 = 2 ^ %d\n", i);
   }
   return 0;}

Brak komentarzy:

Prześlij komentarz