niedziela, 20 maja 2012

najmłodsza cyfra silni


int ld(int n){
        int q, t, x, z, ai;
        q=0; t=0; x=0;
        if( ((n%5)&1)==0 ) t=n%5;
        n /= 5;
        while(n){
                ai=n%5; n/=5;
                q+=ai; x+=q;
                if((ai&1)==0)
                        t += ai; }
        z = (x+t/2)%4; 
        if( z==0 ) return 6;
        else return 1<<z;}

niedziela, 13 maja 2012

binomial


unsigned long binomial (int n, int m) { 
        unsigned long cnm = 1UL; 
        int i, f; 
        if (m*2 >n) 
                m = n-m; 
        for (i=1 ; i <= m; n--, i++) { 
                if ((f=n) % i == 0) 
                        f /= i; 
                else 
                        cnm /= i; 
                cnm *= f; } 
        return cnm; }

niedziela, 8 stycznia 2012

Sito Eratostenesa

#include <iostream>
#include <bitset>
using namespace std;
 
#define N 590000000
bitset <N/2+1> t;
 
int main(){
        int i,j,k;
        printf("N=%d\n", N);
        for( i=1,k=3; k*k<N; k+=2,i++) 
                if( !t.test(i) )
                        for( j=(i*i+i)*2; j+j<N; j += 2*i+1 ) 
                                t.set(j);
        cout << t.size()-t.count()-1;
        return 0;
}

sobota, 7 stycznia 2012

Podzbiory

main() {
        int i, k=1, n, x[100];
        scanf("%d", &n);
        x[1] = 1;
        while (k) {
                for( i=1; i <= k; i++ ) 
                        printf("%d ", x[i]);
                puts("");
                if ( x[k] == n ) {
                        k--;
                        x[k]++;
                } else {
                        k++;
                        x[k] = x[k-1] + 1;}}}

Zamiana

a=(a+b)-(b=a);

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;}

Szybkie potęgowanie

double bpow(double x, long long int n){
        double r=1;
        double xf, xi;
        xf=modf(x, &xi);
        while( 1 ){
                if( n & 1 ){
                        r = r*xi + r*xf; }
                if( n>>=1 ) {
                        xf  = xf*xf + 2*xi*xf;
                        xi *= xi; }
                else 
                        return r; }}

czwartek, 5 stycznia 2012

liczba rozwiązań

#define N 388
typedef unsigned long long int uint;
 
void zero(uint * w){int i;  for(i=0;i<=N;i++) w[i]=0;}
   
void conv(uint * w, uint * a, int s, int e, int h){
   int i,j,jj;
   zero(w); if(e>N/h) e=N/h;
   for(j=s*h,jj=s; jj++<=e; j+=h)
      for(i=0; i+j<=N; i++)  
         w[i+j] +=a[i];
}
int main(){
   uint  w[N+1], a[N+1];
   int i;
   zero(a);  
   for(i=0;i<=N;i++) a[i]=1;
   conv(w, a, 0, N,  2);
   conv(a, w, 0, N,  5);
   conv(w, a, 0, N, 10);
   conv(a, w, 0, N, 20);
   conv(w, a, 0, N, 50);
   conv(a, w, 0, N,100);
   conv(w, a, 0, N,200);
 
   printf("%llu\n",w[N]);
   //for(i=50>N?N:50;i>=0;i--)      
   for( i=0; i<=N; i++ )
      printf("%4d %20llu \n", i, w[i]);
   return 0;
}

naiwny test

int prime( int n ) {
    //if( n<2 ) return 0;
    if( n%2 == 0 ) return n==2;
    if( n%3 == 0 ) return n==3;
    for(int d=5; d*d <= n; d += 6 )
        if( n%d == 0 || n%(d+2) == 0 )
            return 0;
    return 1;}