Cod sursa(job #1551424)

Utilizator bciobanuBogdan Ciobanu bciobanu Data 15 decembrie 2015 21:02:01
Problema Cifre Scor 70
Compilator c Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define MAX_IT 1000000

unsigned x = 123456789, y = 362436069, z = 521288629, w = 88675123;

unsigned xor128(void) {
  unsigned t = x ^ (x<<11);
  x = y; y = z; z = w;
  return w=w^(w>>19)^(t^(t>>8));
}

int main( void ) {
  FILE *fin, *fout;
  int A, B, dig, freq;
  int tmp, i, currFreq, x, ans;

  fin = fopen( "cifre.in", "r" );
  fscanf( fin, "%d%d%d%d", &A, &B, &dig, &freq );
  fclose( fin );

  fout = fopen( "cifre.out", "w" );
  ans = 0;
  if ( B - A + 1 <= MAX_IT ) {
    for ( i = A; i <= B; i++ ) {
      tmp = i;
      currFreq = 0;
      while ( tmp && (freq - currFreq) ) {
        x = tmp / 10;
        currFreq += ( tmp == dig + (x<<1) + (x<<3) );
        tmp = x;
      }
      ans += !(freq - currFreq);
    }
    fprintf( fout, "%.4lf\n", 1.00 * ans / ( B - A + 1 ) );
  } else {
    srand( time(NULL) );
    for ( i = 0; i < MAX_IT; i++ ) {
      tmp = xor128() % ( B - A + 1 ) + A;
      currFreq = 0;
      while ( tmp && (freq - currFreq) ) {
        x = tmp / 10;
        currFreq += ( tmp == dig + (x<<1) + (x<<3) );
        tmp = x;
      }
      ans += !(freq - currFreq);
    }
    fprintf( fout, "%.4lf\n", 1.00 * ans / MAX_IT );
  }
  fclose( fout );
  return 0;
}