UESTC 1299 Date 예 처리,시계 치기,주기 찾기,접두사 와
Time Limit: 2000/1000MS (Java/Others) Memory Limit: 131072/131072KB (Java/Others)
Submit Status
A special day is the day that is xth day in that month, and happens to be xth day in that week.
In
February
1st in 2016, this day in that month happens to be the first day in that week, so we call it a special day. Now, given a time interval, how many special days in total?
Input
The first line is an integer T(T≤55), denoting the number of test cases.
Then T lines follows, each test case one line.
Each line contains two dates A and B, following such format:
year month day
. year≤109 , month and day will be legal.
A and B will all be later than 2016/1/31, and B will not be earlier than A.
Output
For each query, output the answer in one line.
Sample input and output
Sample Input
Sample Output
2
2016 2 1 2016 2 7
2016 2 1 2022 6 1
7
77
Hint
Note that the answer may be large, please using
long long
Source
The 14th UESTC Programming Contest Preliminary
My Solution
too young too simple,그 당시 첫 경기 때 는 반드시 주기 가 있 을 것 이 라 고 생각 했 습 니 다.그리고 어떤 주기 인지 생각 나 지 않 으 면 몇 개 맞 춰 볼 수 없 었 습 니까?가장 특별한 것 부터 맞 혀 보 세 요.
400,1200,윤년 과 관련 된 숫자.
365 % 7 == 1
366 % 7 == 2
400 년 넘 게 나 온 날 수 는 딱 7 로 나 눌 수 있 기 때문에 400 년 을 주기 로 할 수 있다.
당시 시합 을 할 때 필 자 는 강제로 달력 에서 규칙 을 찾 았 는데 주기 가 28 일 수도 있 고 28 년 이 넘 은 것 도 7 로 나 눌 수 있 지만 부족 하고 불완전 하 다 는 것 을 발견 했다.
경기 후 400 년 이 최소 주기 인지 WA 가 3 발 인지 알 게 되 었 다. 주로 구체 적 인 처리 주기,주기 총 specialdays,출력 시의 처리,
if(cnt[y1][m1]){
if(d1>7)cout<7 이면 바로 빼 도 됩 니 다.
else cout< }
else cout<
#include
#include
#include
using namespace std;
bool cnt[401][13];
int date[13];
bool runnian(int yr)
{
if(yr % 400 != 0) {if(yr % 100 == 0) return false;else if(yr % 4 != 0) return false; else return true;}
else return true;
}
int main()
{
#ifdef LOCAL
freopen("a.txt", "r", stdin);
#endif // LOCAL
date[1]=31; date[2]=28; date[3]=31; date[4]=30; date[5]=31; date[6]=30; date[7]=31; date[8]=31; date[9]=30; date[10]=31; date[11]=30; date[12]=31;
int thedays;
long long specialday = 14;
memset(cnt, 0, sizeof cnt);
cnt[0][2]=1;
cnt[0][8]=1;
thedays = 335;
for(int i = 2017; i < 2016+400; i++){ // , special days
for(int j = 1; j <= 12; j++){
thedays += date[j]; if(j == 2) thedays += runnian(i); //if return true then add 1, else add 0 // only if j == 2, we judge the runnian()
if(thedays % 7 == 0) {/*it is wrong cnt[i-2016][j+1 > 12 ? 1 : j+1] = true;*/
if(j != 12) cnt[i-2016][j + 1] = true;
else cnt[i-2016+1][1] = true;
specialday += 7;
if(i == 2415 && j == 12) specialday -= 7;
}
}
}
// 2016 1 1 2415 12 1
/*
cout<7) sum1 += 7; else sum1 += d1;}
//cout<7) sum2 += 7; else sum2 += d2;}
//cout< 7)cout<
시합 때의 돌발 기 사 를 붙 이 고 만 년 력 을 찾 고 수 동 으로 시 계 를 치 려 고 했 는데,다행히 내 가 생각해 낼 수 있 었 다.하하☺☺
#include
#include
#include
using namespace std;
int cnt[10000][100];
int main()
{
memset(cnt, 0, sizeof cnt);
cnt[0][2]=1;
cnt[0][8]=1;
cnt[1][5]=1;
cnt[2][1]=1;
cnt[2][10]=1;
cnt[3][4]=1;
cnt[3][7]=1;
cnt[4][6]=1;
cnt[5][2]=1;
cnt[5][3]=1;
cnt[5][11]=1;
cnt[6][8]=1;
cnt[7][5]=1;
cnt[8][1]=1;
cnt[8][4]=1;
cnt[8][7]=1;
cnt[9][9]=1;
cnt[9][12]=1;
cnt[10][10]=1;
cnt[11][2]=1;
cnt[11][3]=1;
cnt[11][11]=1;
cnt[12][5]=1;
cnt[13][1]=1;
cnt[13][10]=1;
cnt[14][4]=1;
cnt[14][7]=1;
cnt[15][9]=1;
cnt[15][12]=1;
cnt[16][3]=1;
cnt[16][11]=1;
cnt[17][8]=1;
cnt[18][5]=1;
cnt[19][1]=1;
cnt[19][10]=1;
cnt[20][9]=1;
cnt[20][12]=1;
cnt[21][6]=1;
cnt[22][2]=1;
cnt[22][3]=1;
cnt[22][11]=1;
cnt[23][8]=1;
cnt[24][10]=1;
cnt[25][4]=1;
cnt[25][7]=1;
cnt[26][9]=1;
cnt[26][12]=1;
cnt[27][6]=1;
//freopen("a.txt", "r", stdin);
int T,y1,y2,m1,m2,d1,d2;
long long sum1,sum2;
scanf("%d", &T);
while(T--){
sum1 = 0;sum2 = 0;
scanf("%d%d%d%d%d%d", &y1, &m1, &d1, &y2, &m2, &d2);
long long t = (y1-2016)/28;sum1 += t*48;y1 = (y1-2016) % 28;
for(int i = 0; i < y1; i++){
for(int j = 1; j <= 12; j++)
if(cnt[i][j]) sum1++;
}
for(int i = 1; i < m1; i++)
if(cnt[y1][i]) sum1++;
if(cnt[y1][m1]){if(d1>7) sum1 += 7; else sum1 += d1;}
//cout<7) sum2 += 7; else sum2 += d2;}
//cout<
Thank you!