题目:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=115189#problem/C
代码:
#include <cstdio> #include <cstring> #include <iostream> using namespace std; typedef long long ll; const int N=100005; const int Max=1753+2800; //返回指定日期是星期几 int yy[N],mm[N],dd[N]; int id[10005][20][50]; //模板 计算日期是星期几 返回0~6 代表星期7 1~6 int weekday(int y,int m,int d) { int tm=m>=3?(m-2):(m+10); int ty=m>=3?y:(y-1); return (ty+ty/4-ty/100+ty/400+(int)(2.6*tm-0.2)+d)%7; } int main() { int leap; int c=0; for(int i=1753; i<Max; i++) { for(int j=1; j<=12; j++) { if(weekday(i,j,1)==1) { yy[c]=i; mm[c]=j; dd[c]=1; id[i][j][1]=c++; } if(weekday(i,j,11)==1) { yy[c]=i; mm[c]=j; dd[c]=11; id[i][j][11]=c++; } if(weekday(i,j,21)==1) { yy[c]=i; mm[c]=j; dd[c]=21; id[i][j][21]=c++; } } } int t; cin>>t; while(t--) { int Y,M,D,n; cin>>Y>>M>>D>>n; int y=Y; while(y>=Max) { y-=2800; } int idd=id[y][M][D]; // cout<<idd<<endl; int nn=(idd+n-1)%c; //cout<<yy[nn]<<endl; int m=mm[nn],d=dd[nn]; //cout<<Y<<endl; int yyy=Y+(idd+n-1)/c*2800+(yy[nn]-y); //printf("%d\n",1ll*Y+1ll*(idd+n-1)/c*2800+1ll*(yy[nn]-y)); cout<<yyy<<" "<<m<<" "<<d<<endl; } }
WA代码:
#include<stdio.h> #include<string.h> #include<stdlib.h> using namespace std; int a[100000]; int b[100000]; int c[100000]; int main() { //freopen("B.out.txt","w",stdout); int i=0; int ans=0; for(int year=1753; year<=1753+800; year++) { for(int month=1; month<=12; month++) { for(int day=1; day<=21; day=day+10) { int d=day; int m=month; int y=year; if(m==1) { y=y-1; m=m+12; } if(m==2) { y=y-1; m=m+12; } if( (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) % 7==0) { i++; a[i]=year; b[i]=month; c[i]=day; ans++; } } } } //printf("%d\n",ans); //printf("%d %d %d\n",a[1357],b[1357],c[1357]); int t; scanf("%d",&t); while(t--) { int q,w,e,r; scanf("%d%d%d%d",&q,&w,&e,&r); int temp=(q-1753)%400+1753; for(int i=1; i<=2058; i++) { if(a[i]==temp) { if(b[i]==w) { if(c[i]==e) { int t; if(((i+r)%2058)-1==0) //每400年 2058一个周期 { t=2058; } else if(((i+r)%2058)-1==-1) { t=2057; } else t=((i+r)%2058)-1; int k; if(r%2058==0) k=r/2058-1; else k=r/2058; //printf("%d %d\n",i+r,t); printf("%d %d %d\n",1753+(k)*400+a[t]-1753,b[t],c[t]); break; } } } } } }
CAI 呀。