Advertisement
Alberts00

NOVOL datums

Jan 16th, 2014
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.42 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <sstream>
  4. #include <cstdlib>
  5.  
  6. #define IFILE "datums.dat"
  7. #define OFILE "datums.rez"
  8.  
  9. using namespace std;
  10.  
  11. struct _dienas { int d[10]; int day; int month; } dienas[366];
  12.  
  13. int chk(int a1,int a2,int a3,int a4){
  14.     if( a4 % 2 == 1 ) return 0;
  15.     int gads = a1*1000+a2*100+a3*10+a4;
  16.     if( gads % 400 == 0 ) return 1;
  17.     if( gads % 100 == 0 ) return 0;
  18.     return (gads % 4 == 0 ? 1 : 0);
  19. }
  20.  
  21. int variants(int iday,int a1,int a2, int a3, int a4){
  22.     int r=0;
  23.     if( a1 == 0 && a2 == 0 && a3 == 0 && a4 == 0 ) return 0;
  24.     if( iday != 59 ) return 24;
  25.     r += chk(a1,a2,a3,a4);
  26.     r += chk(a1,a2,a4,a3);
  27.     r += chk(a1,a3,a2,a4);
  28.     r += chk(a1,a3,a4,a2);
  29.     r += chk(a1,a4,a2,a3);
  30.     r += chk(a1,a4,a3,a2);
  31.  
  32.     r += chk(a2,a1,a3,a4);
  33.     r += chk(a2,a1,a4,a3);
  34.     r += chk(a2,a3,a1,a4);
  35.     r += chk(a2,a3,a4,a1);
  36.     r += chk(a2,a4,a1,a3);
  37.     r += chk(a2,a4,a3,a1);
  38.  
  39.     r += chk(a3,a1,a2,a4);
  40.     r += chk(a3,a1,a4,a2);
  41.     r += chk(a3,a2,a1,a4);
  42.     r += chk(a3,a2,a4,a1);
  43.     r += chk(a3,a4,a1,a2);
  44.     r += chk(a3,a4,a2,a1);
  45.  
  46.     r += chk(a4,a1,a2,a3);
  47.     r += chk(a4,a1,a3,a2);
  48.     r += chk(a4,a2,a1,a3);
  49.     r += chk(a4,a2,a3,a1);
  50.     r += chk(a4,a3,a1,a2);
  51.     r += chk(a4,a3,a2,a1);
  52.     return r;
  53. }
  54.  
  55. int main(int argc, char *argv[]) {
  56.    
  57.     ifstream is;
  58.     ofstream os;
  59.    
  60.     int d[10],tmp[10],i,j,k,l,divs,y[4],rez=0; 
  61.     char c;
  62.     bool canbe;
  63.  
  64.     for( i=0;i<10;i++) d[i] = 0;
  65.    
  66.     is.open(IFILE);
  67.     for( i=0; i<8; i++){ is >> c; d[c-'0']++; }
  68.     is.close();
  69.  
  70.     k = -1;
  71.     for( i=1;i<=12;i++)
  72.        for( j=1;j<=31;j++){
  73.         if( ((i == 4 || i == 6 || i == 9 || i == 11) && (j==31)) || (i==2 && j>=30) ) continue;
  74.         ++k;
  75.         for( l=0;l<10;l++) dienas[k].d[l] = 0;     
  76.         dienas[k].d[i % 10]++;     
  77.         dienas[k].d[j % 10]++;     
  78.         dienas[k].d[i / 10]++;     
  79.         dienas[k].d[j / 10]++; 
  80.         dienas[k].day = j;
  81.         dienas[k].month = i;   
  82.     }
  83.  
  84.  
  85.     for( i=0; i<366; i++){
  86.         canbe = true;
  87.         divs = 1;
  88.         for( j=0; j< 10; j++ ){
  89.             tmp[j] = d[j] - dienas[i].d[j];
  90.             switch(tmp[j]){
  91.                 case 4: divs *= 4;
  92.                 case 3: divs *= 3;
  93.                 case 2: divs *= 2;
  94.             }
  95.             if( tmp[j] < 0 ){
  96.                 canbe = false;
  97.                 break;
  98.             }
  99.         }
  100.         if( canbe ){
  101.             l = 0;
  102.             for( j=0; j< 10; j++ ){
  103.                 while( tmp[j] > 0 ){ y[l++] = j; tmp[j]--; }
  104.             }
  105.             rez += variants(i,y[0],y[1],y[2],y[3])/divs;
  106. //          cout<< endl <<dienas[i].day<<' '<<dienas[i].month<<' '<<y[0]<<y[1]<<y[2]<<y[3]<<' '<<rez;  
  107.         }
  108.     }
  109.  
  110.     os.open(OFILE);
  111.     os << rez;
  112.     os.close();
  113.    
  114.     return 0;
  115. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement