C、276 219バイト
#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;}
stdoutのstdin出力からの入力は、http: //ideone.com/XtuhGjを試行します [デバッグ機能はzです]
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||m<=0||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");
}
}