弱到一定程度了... 不过还好.又涨经
值和姿势了.....
月份和日期都比较小, (12,31) 果断暴力, 然后判定下当前月份和天数是否合法.
#include<cstdio> #include<cstdlib> #include<cstring> using namespace std; int day[2][13] = { {0,31,28,31,30,31,30,31,31,30,31,30,31 } ,{0,31,29,31,30,31,30,31,31,30,31,30,31 } }; int gcd(int a,int b){ return b==0?a:gcd(b,a%b); } int lcm(int a,int b){ return a*b/gcd(a,b); } bool key(int y){ if( (y%400==0) || ((y%100!=0)&&(y%4==0)) ) return true; return false; } bool legal(int m, int d, int y){ if( d <= day[ key(y) ][m] ) return true; return false; } int main(){ int T; scanf("%d", &T); for(int Case = 1; Case <= T; Case++){ int x, y, z; scanf("%d%d%d", &x,&y,&z); int cnt = 0, aa,bb; for(int a = 1; a <= 12; a++){ for(int b = 1; b <= 31; b++){ if( (gcd(a,b)==x) && (lcm(a,b)==y) ){ if( legal(a,b,z) ){ cnt++; aa = a, bb = b; } } } } printf("Case #%d: ", Case); if( cnt == 0 ) printf("-1\n"); else if( cnt == 1 ) printf("%d/%02d/%02d\n", z, aa, bb); else puts("1"); } return 0; }