#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;}
piątek, 6 stycznia 2012
Partycje
Subskrybuj:
Komentarze do posta (Atom)
Brak komentarzy:
Prześlij komentarz