BoxerTC

Untitled

Apr 23rd, 2015
309
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.63 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define sc( x ) scanf( "%d" , &x )
  5. #define REP( i , n ) for( int i = 0 ; i < n ; ++i )
  6. #define clr( t , val ) memset( t , val , sizeof( t ) )
  7.  
  8. #define pb push_back
  9. #define all( v ) v.begin() , v.end()
  10. #define SZ( v ) ((int)(v).size())
  11.  
  12. #define mp make_pair
  13. #define fi first
  14. #define se second
  15.  
  16. #define N 15
  17.  
  18. typedef long long ll;
  19.  
  20. string D[] = { "" , "Lunes" , "Martes" , "Miercoles" , "Jueves" , "Viernes" , "Sabado" , "Domingo" , ""};
  21. string M[] = { "" , "Enero" , "Febrero" , "Marzo" , "Abril" , "Mayo" , "Junio" , "Julio" , "Agosto" , "Setiembre" , "Octubre" , "Noviembre" , "Diciembre" , "" };
  22. ll Tot[] = { 0 , 31 , 28 , 31 , 30 , 31 , 30 , 31 , 31 , 30 , 31 , 30 , 31 , 0 };
  23. //1 Jan 1900 was a Monday.
  24. ///En days Lunes  == 1 , Martes == 2 ..etc
  25. // modulus lunes = 1 , martes = 2 ..... saturday = 6 sunday = 0
  26. // property the days of the week repeats every 400 years this because taking segments of years [ 0 400 > [ 400 800 ]...
  27. // number of day(including leap years) = (365*400 + 400/4-400/100+400/400) mod 7 = 0
  28. bool is_leap_year( ll year ){ return  ( ( ( year % 4 == 0 ) && ( year % 100 != 0) ) || ( year % 400 == 0) ); }
  29. ll tot_day_for_month( ll mes , ll year ){
  30.     return ( ( mes == 2 && is_leap_year( year ) ) ? 29 : Tot[ mes ] );
  31. }
  32. ll countBis( ll x ){
  33.     return (x / 4LL) - (x / 100LL) + (x / 400LL);
  34. }
  35. ll dayCount( ll day, ll month , ll year ) {
  36.     ll days = 365LL * ( year - 1LL );
  37.     days += countBis( year - 1LL );
  38.     for( int m = 1 ; m < month ; m++ ) days += tot_day_for_month( m , year );
  39.     return days + day ;
  40. }
  41. bool valid( ll d , ll m , ll y ){
  42.     if( m >= 1 && m <= 12 ){
  43.         if( d >= 1 && d <= tot_day_for_month( m , y ) ) return 1;
  44.     }
  45.     return 0;
  46. }
  47. void prevDate( ll d , ll m , ll y , ll &dd , ll &mm , ll &yy ){
  48.     dd = d - 1 , mm = m , yy = y;
  49.     if( valid( dd , mm , yy ) ) return;
  50.     mm = m - 1 , yy = y;
  51.     dd = tot_day_for_month( mm , yy );
  52.     if( valid( dd , mm , yy ) ) return;
  53.     dd = 31 , mm = 12 , yy = y - 1;
  54. }
  55.  
  56. ll cnt = 0;
  57. ll F[ 400 + 5 ][ 12 + 5 ];
  58. ll get( ll d , ll m , ll y ){
  59.     return (y / 400) * cnt + F[ y % 400 ][ m ];
  60. }
  61. int main(){
  62.     ll X = dayCount( 1 , 1 , 2000 );
  63.     for( int y = 2000 ; y < 2400 ; ++y ){
  64.         for( int m = 1 ; m <= 12 ; ++m ){
  65.             if( X % 7 == 0 ) cnt ++;
  66.             F[ y - 2000 ][ m ] = cnt;
  67.             X += tot_day_for_month( m , y );
  68.         }
  69.     }
  70.     int cases;
  71.     sc( cases );
  72.     REP( tc , cases ){
  73.         ll y1 , m1 , d1;
  74.         ll y2 , m2 , d2;
  75.         scanf( "%lld%lld%lld" , &y1 , &m1 , &d1 );
  76.         scanf( "%lld%lld%lld" , &y2 , &m2 , &d2 );
  77.         prevDate( d1 , m1 , y1 , d1 , m1 , y1 );
  78.         ll A = get( d1 , m1 , y1 ) , B = get( d2 , m2 , y2 );
  79.         printf( "%lld\n" , B - A );
  80.     }
  81. }
Advertisement
Add Comment
Please, Sign In to add comment