Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- #define sc( x ) scanf( "%d" , &x )
- #define REP( i , n ) for( int i = 0 ; i < n ; ++i )
- #define clr( t , val ) memset( t , val , sizeof( t ) )
- #define pb push_back
- #define all( v ) v.begin() , v.end()
- #define SZ( v ) ((int)(v).size())
- #define mp make_pair
- #define fi first
- #define se second
- #define N 15
- typedef long long ll;
- string D[] = { "" , "Lunes" , "Martes" , "Miercoles" , "Jueves" , "Viernes" , "Sabado" , "Domingo" , ""};
- string M[] = { "" , "Enero" , "Febrero" , "Marzo" , "Abril" , "Mayo" , "Junio" , "Julio" , "Agosto" , "Setiembre" , "Octubre" , "Noviembre" , "Diciembre" , "" };
- ll Tot[] = { 0 , 31 , 28 , 31 , 30 , 31 , 30 , 31 , 31 , 30 , 31 , 30 , 31 , 0 };
- //1 Jan 1900 was a Monday.
- ///En days Lunes == 1 , Martes == 2 ..etc
- // modulus lunes = 1 , martes = 2 ..... saturday = 6 sunday = 0
- // property the days of the week repeats every 400 years this because taking segments of years [ 0 400 > [ 400 800 ]...
- // number of day(including leap years) = (365*400 + 400/4-400/100+400/400) mod 7 = 0
- bool is_leap_year( ll year ){ return ( ( ( year % 4 == 0 ) && ( year % 100 != 0) ) || ( year % 400 == 0) ); }
- ll tot_day_for_month( ll mes , ll year ){
- return ( ( mes == 2 && is_leap_year( year ) ) ? 29 : Tot[ mes ] );
- }
- ll countBis( ll x ){
- return (x / 4LL) - (x / 100LL) + (x / 400LL);
- }
- ll dayCount( ll day, ll month , ll year ) {
- ll days = 365LL * ( year - 1LL );
- days += countBis( year - 1LL );
- for( int m = 1 ; m < month ; m++ ) days += tot_day_for_month( m , year );
- return days + day ;
- }
- bool valid( ll d , ll m , ll y ){
- if( m >= 1 && m <= 12 ){
- if( d >= 1 && d <= tot_day_for_month( m , y ) ) return 1;
- }
- return 0;
- }
- void prevDate( ll d , ll m , ll y , ll &dd , ll &mm , ll &yy ){
- dd = d - 1 , mm = m , yy = y;
- if( valid( dd , mm , yy ) ) return;
- mm = m - 1 , yy = y;
- dd = tot_day_for_month( mm , yy );
- if( valid( dd , mm , yy ) ) return;
- dd = 31 , mm = 12 , yy = y - 1;
- }
- ll cnt = 0;
- ll F[ 400 + 5 ][ 12 + 5 ];
- ll get( ll d , ll m , ll y ){
- return (y / 400) * cnt + F[ y % 400 ][ m ];
- }
- int main(){
- ll X = dayCount( 1 , 1 , 2000 );
- for( int y = 2000 ; y < 2400 ; ++y ){
- for( int m = 1 ; m <= 12 ; ++m ){
- if( X % 7 == 0 ) cnt ++;
- F[ y - 2000 ][ m ] = cnt;
- X += tot_day_for_month( m , y );
- }
- }
- int cases;
- sc( cases );
- REP( tc , cases ){
- ll y1 , m1 , d1;
- ll y2 , m2 , d2;
- scanf( "%lld%lld%lld" , &y1 , &m1 , &d1 );
- scanf( "%lld%lld%lld" , &y2 , &m2 , &d2 );
- prevDate( d1 , m1 , y1 , d1 , m1 , y1 );
- ll A = get( d1 , m1 , y1 ) , B = get( d2 , m2 , y2 );
- printf( "%lld\n" , B - A );
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment