题目: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;
}
}
网上的代码,直接抄的。那个是 一LL 。还以为是一百一十一。
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;
}
}
}
}
}
}
代码实现能力不强,会做也A不掉。
CAI 呀。