#define R return
#define L(i) for(;i-->0;)
u( y, m) { R m- 1 ? 30 + ( ( 2773 >> m) & 1 ) : 28 + ( y% 4 == 0 && y% 100 || y% 400 == 0 ) ; } s( y, m, g) { g+= 4 ; L( m) g+= u( y, m) , g%= 7 ; L( y) g+= 1 + u( y, 1 ) , g%= 7 ; R g; } z( y, m, r) { m= 12 ; L( m) s( y, m, 13 ) - 4 || ( r|= 1 << ( m+ 1 ) ) ; R r; }
w( y, m, r) { m= 12 ; L( m) s( y, m, u( y, m) ) || ( r|= 1 << ( m+ 1 ) ) ; R r; }
/*
// ritorna il numero dei giorni di anno=y mese=m con mese in 0..11
// m==1 significa febbraio y%4?0:y%100?1:!(y%400) non funziona
u(y,m){R m-1?30+((2773>>m)&1):28+(y%4==0&&y%100||y%400==0);}
// argomenti anno:y[0..0xFFFFFFF] mese:m[0..11] giorno:g[1..u(y,m)]
// ritorna il numero del giorno[0..6]
s(y,m,g)
{g+=4; // correzione per il giorno di partenza anno mese giorno = 0,1,1
L(m)g+= u(y,m),g%=7; // m:0..m-1 somma mod 7 i giorni del mese dell'anno y
L(y)g+=1+u(y,1),g%=7; // y:0..y-1 somma mod 7 gli anni da 0..y-1
// g+=1+u(y,1) poiche' (365-28)%7=1 e 1 e' febbraio
R g;
}
// argomenti anno:y[0..0xFFFFFFF], m=0 r=0
// calcola tutti gli ultimi giorni del mese dell'anno y che cadono di lunedi'
// e mette tali mesi come bit, dal bit 1 al bit 12 [il bit 0 sempre 0] in r
w(y,m,r){m=12;L(m)s(y,m,u(y,m))||(r|=1<<(m+1));R r;}
// argomenti anno:y[0..0xFFFFFFF], m=0 r=0
//ritorna in r il numero dei mesi che ha giorno 13 di venerdi[==4]
// e mette tali mesi come bit, dal bit 1 al bit 12 [il bit 0 sempre 0] in r
z(y,m,r){m=12;L(m)s(y,m,13)-4||(r|=1<<(m+1));R r;}
*/
#define P printf
#define W while
#define M main
#define F for
#define U unsigned
#define N int
#define B break
#define I if
#define J(a,b) if(a)goto b
#define G goto
#define P printf
#define D double
#define C unsigned char
#define A getchar()
#define O putchar
#define Y malloc
#define Z free
#define S sizeof
#define T struct
#define E else
#define Q static
#define X continue
M( )
{ N y, m, g, r, arr[ ] = { 1 , 297 , 1776 , 2000 , 2016 , 3385 } , arr1[ ] = { 2016 , 1 , 1997 , 1337 , 123456789 } ;
C* mese[ ] = { "gen" , "feb" , "mar" , "apr" , "mag" , "giu" , "lug" , "ago" , "set" , "ott" , "nov" , "dic" } ;
C* giorno[ ] = { "Lun" , "Mar" , "Mer" , "Gio" , "Ven" , "Sab" , "Dom" } ;
P
( "Inserisci Anno mese giorno>" ) ; r
= scanf ( "%d %d %d" , & y
, & m
, & g
) ; P( "Inseriti> %d %d %d r=%d\n " , y, m, g, r) ;
I( r!= 3 || m> 12 || g> u( y, m- 1 ) ) R 0 ;
r= s( y, m- 1 , g) ; // 12-> 11 -> 0..10
P( "Risultato=%d giorno=%s\n " , r, giorno[ r] ) ;
r= w( y, 0 , 0 ) ; P( " r=%d " , r) ; P( "\n " ) ;
F( m= 0 ; m< 6 ;++ m)
{ P( "N anno=%d -->" , arr[ m] ) ;
r= w( arr[ m] , 0 , 0 ) ; // ritorna in r i mesi tramite i suoi bit...
F( y= 1 ; y< 13 ;++ y) I( r& ( 1 << y) ) P( "%s " , mese[ y- 1 ] ) ;
P( "\n " ) ;
}
F( m= 0 ; m< 4 ;++ m)
{ P( "N anno=%d -->" , arr1[ m] ) ;
r= z( arr1[ m] , 0 , 0 ) ; // ritorna in r i mesi tramite i suoi bit...
F( y= 1 ; y< 13 ;++ y) I( r& ( 1 << y) ) P( "%s " , mese[ y- 1 ] ) ;
P( "\n " ) ;
}
}
ICAgICNkZWZpbmUgUiByZXR1cm4KICAgICNkZWZpbmUgTChpKSBmb3IoO2ktLT4wOykgCiAgICB1KHksbSl7UiBtLTE/MzArKCgyNzczPj5tKSYxKToyOCsoeSU0PT0wJiZ5JTEwMHx8eSU0MDA9PTApO31zKHksbSxnKXtnKz00O0wobSlnKz11KHksbSksZyU9NztMKHkpZys9MSt1KHksMSksZyU9NztSIGc7fXooeSxtLHIpe209MTI7TChtKXMoeSxtLDEzKS00fHwocnw9MTw8KG0rMSkpO1Igcjt9CgogICAgCiAgICB3KHksbSxyKXttPTEyO0wobSlzKHksbSx1KHksbSkpfHwocnw9MTw8KG0rMSkpO1Igcjt9CiAgICAvKiAgICAKICAgIC8vIHJpdG9ybmEgaWwgbnVtZXJvIGRlaSBnaW9ybmkgZGkgYW5ubz15IG1lc2U9bSBjb24gbWVzZSBpbiAwLi4xMQogICAgLy8gbT09MSBzaWduaWZpY2EgZmViYnJhaW8gICB5JTQ/MDp5JTEwMD8xOiEoeSU0MDApIG5vbiBmdW56aW9uYQogICAgdSh5LG0pe1IgbS0xPzMwKygoMjc3Mz4+bSkmMSk6MjgrKHklND09MCYmeSUxMDB8fHklNDAwPT0wKTt9CiAgICAKICAgIC8vIGFyZ29tZW50aSBhbm5vOnlbMC4uMHhGRkZGRkZGXSAgbWVzZTptWzAuLjExXSAgZ2lvcm5vOmdbMS4udSh5LG0pXQogICAgLy8gcml0b3JuYSBpbCBudW1lcm8gZGVsIGdpb3Jub1swLi42XQogICAgcyh5LG0sZykKICAgIHtnKz00OyAvLyBjb3JyZXppb25lIHBlciBpbCBnaW9ybm8gZGkgcGFydGVuemEgYW5ubyBtZXNlIGdpb3JubyA9IDAsMSwxCiAgICAgTChtKWcrPSAgdSh5LG0pLGclPTc7IC8vIG06MC4ubS0xICBzb21tYSBtb2QgNyBpIGdpb3JuaSBkZWwgbWVzZSBkZWxsJ2Fubm8geQogICAgIEwoeSlnKz0xK3UoeSwxKSxnJT03OyAvLyB5OjAuLnktMSAgc29tbWEgbW9kIDcgZ2xpIGFubmkgZGEgMC4ueS0xCiAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGcrPTErdSh5LDEpIHBvaWNoZScgKDM2NS0yOCklNz0xIGUgMSBlJyBmZWJicmFpbwogICAgIFIgZzsKICAgIH0KICAgIAogICAgLy8gYXJnb21lbnRpIGFubm86eVswLi4weEZGRkZGRkZdLCBtPTAgcj0wIAogICAgLy8gY2FsY29sYSB0dXR0aSBnbGkgdWx0aW1pIGdpb3JuaSBkZWwgbWVzZSBkZWxsJ2Fubm8geSBjaGUgY2Fkb25vIGRpIGx1bmVkaScKICAgIC8vIGUgbWV0dGUgdGFsaSBtZXNpIGNvbWUgYml0LCBkYWwgYml0IDEgYWwgYml0IDEyIFtpbCBiaXQgMCBzZW1wcmUgMF0gaW4gcgogICAgdyh5LG0scil7bT0xMjtMKG0pcyh5LG0sdSh5LG0pKXx8KHJ8PTE8PChtKzEpKTtSIHI7fQogICAgCiAgICAvLyBhcmdvbWVudGkgYW5ubzp5WzAuLjB4RkZGRkZGRl0sIG09MCByPTAgCiAgICAvL3JpdG9ybmEgaW4gciBpbCBudW1lcm8gZGVpIG1lc2kgY2hlIGhhIGdpb3JubyAxMyBkaSB2ZW5lcmRpWz09NF0KICAgIC8vIGUgbWV0dGUgdGFsaSBtZXNpIGNvbWUgYml0LCBkYWwgYml0IDEgYWwgYml0IDEyIFtpbCBiaXQgMCBzZW1wcmUgMF0gaW4gcgogICAgeih5LG0scil7bT0xMjtMKG0pcyh5LG0sMTMpLTR8fChyfD0xPDwobSsxKSk7UiByO30KICAgICovCiAgICAKICAgICNkZWZpbmUgUCBwcmludGYKICAgICNkZWZpbmUgVyB3aGlsZSAKICAgICNkZWZpbmUgTSBtYWluIAogICAgI2RlZmluZSBGIGZvcgogICAgI2RlZmluZSBVIHVuc2lnbmVkCiAgICAjZGVmaW5lIE4gaW50CiAgICAjZGVmaW5lIEIgYnJlYWsKICAgICNkZWZpbmUgSSBpZgogICAgI2RlZmluZSBKKGEsYikgIGlmKGEpZ290byBiCiAgICAjZGVmaW5lIEcgZ290bwogICAgI2RlZmluZSBQIHByaW50ZgogICAgI2RlZmluZSBEIGRvdWJsZQogICAgI2RlZmluZSBDIHVuc2lnbmVkIGNoYXIKICAgICNkZWZpbmUgQSBnZXRjaGFyKCkKICAgICNkZWZpbmUgTyBwdXRjaGFyCiAgICAjZGVmaW5lIFkgbWFsbG9jCiAgICAjZGVmaW5lIFogZnJlZQogICAgI2RlZmluZSBTIHNpemVvZgogICAgI2RlZmluZSBUIHN0cnVjdAogICAgI2RlZmluZSBFIGVsc2UKICAgICNkZWZpbmUgUSBzdGF0aWMKICAgICNkZWZpbmUgWCBjb250aW51ZQogICAgTSgpCiAgICB7TiB5LG0sZyxyLGFycltdPXsxLDI5NywxNzc2LDIwMDAsMjAxNiwzMzg1fSwgYXJyMVtdPXsyMDE2LDEsMTk5NywxMzM3LDEyMzQ1Njc4OX07CiAgICAgQyptZXNlW109eyJnZW4iLCJmZWIiLCJtYXIiLCJhcHIiLCJtYWciLCJnaXUiLCJsdWciLCJhZ28iLCJzZXQiLCJvdHQiLCJub3YiLCJkaWMifTsKICAgICBDKmdpb3Jub1tdPXsiTHVuIiwiTWFyIiwiTWVyIiwiR2lvIiwiVmVuIiwiU2FiIiwiRG9tIn07CiAgICAgUCgiSW5zZXJpc2NpIEFubm8gbWVzZSBnaW9ybm8+Iik7cj1zY2FuZigiJWQgJWQgJWQiLCAmeSwgJm0sICZnKTsKICAgICBQKCJJbnNlcml0aT4gJWQgJWQgJWQgcj0lZFxuIiwgeSwgbSwgZywgcik7CiAgICAgSShyIT0zfHxtPjEyfHxnPnUoeSxtLTEpKVIgMDsKICAgICByPXMoeSxtLTEsZyk7Ly8gMTItPiAxMSAtPiAwLi4xMAogICAgIFAoIlJpc3VsdGF0bz0lZCBnaW9ybm89JXNcbiIsIHIsIGdpb3Jub1tyXSk7CiAgICAgcj13KHksMCwwKTtQKCIgcj0lZCAiLCByKTtQKCJcbiIpOwogICAgIEYobT0wO208NjsrK20pCiAgICAgICAgICAgIHtQKCJOIGFubm89JWQgLS0+IixhcnJbbV0pOyAKICAgICAgICAgICAgIHI9dyhhcnJbbV0sMCwwKTsgLy8gcml0b3JuYSBpbiByIGkgbWVzaSB0cmFtaXRlIGkgc3VvaSBiaXQuLi4KICAgICAgICAgICAgIEYoeT0xO3k8MTM7Kyt5KSBJKHImKDE8PHkpKVAoIiVzICIsbWVzZVt5LTFdKTsKICAgICAgICAgICAgIFAoIlxuIik7CiAgICAgICAgICAgIH0KICAgICBGKG09MDttPDQ7KyttKQogICAgICAgICAgICB7UCgiTiBhbm5vPSVkIC0tPiIsYXJyMVttXSk7IAogICAgICAgICAgICAgcj16KGFycjFbbV0sMCwwKTsgLy8gcml0b3JuYSBpbiByIGkgbWVzaSB0cmFtaXRlIGkgc3VvaSBiaXQuLi4KICAgICAgICAgICAgIEYoeT0xO3k8MTM7Kyt5KSBJKHImKDE8PHkpKVAoIiVzICIsbWVzZVt5LTFdKTsKICAgICAgICAgICAgIFAoIlxuIik7CiAgICAgICAgICAgIH0KICAgICAKICAgIH0KICAgIA==