WA到吐血,先这样吧。。。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
#include <cmath>
#include <algorithm>
#include <vector>
#include <map>
#include <string>
#include <stack>
using namespace std;
typedef long long ll;
#define PI 3.1415926535897932
#define E 2.718281828459045
#define INF 0x3f3f3f3f
#define mod 100000007
const int M=1005;
int n,m;
int cnt;
int sx,sy,sz;
int mp[1000][1000];
int pa[M*10],rankk[M];
int head[M*6],vis[M*100];
int dis[M*100];
ll prime[M*1000];
bool isprime[M*1000];
int lowcost[M],closet[M];
char st1[5050],st2[5050];
int len[M*6];
typedef pair<int ,int> ac;
//vector<int> g[M*10];
int dp[M];
int has[10500];
int month[13]= {0,31,59,90,120,151,181,212,243,273,304,334,0};
int dir[8][2]= {{0,1},{0,-1},{-1,0},{1,0},{1,1},{1,-1},{-1,1},{-1,-1}};
void getpri()
{
ll i;
int j;
cnt=0;
memset(isprime,false,sizeof(isprime));
for(i=2; i<1000000LL; i++)
{
if(!isprime[i])prime[cnt++]=i;
for(j=0; j<cnt&&prime[j]*i<1000000LL; j++)
{
isprime[i*prime[j]]=1;
if(i%prime[j]==0)break;
}
}
}
struct node
{
int v,w;
node(int vv,int ww)
{
v=vv;
w=ww;
}
};
vector<int> g[M*100];
string str[1000];
//int dp[10000];
//int a[1000],b[1000];
int ans;
int ha9(int n)
{
int sum=0;
if(n>1000)
{
if(n%10==9)sum++;
if(n/10%10==9)sum++;
if(n/100%10==9)sum++;
if(n/1000%10==9)sum++;
}
else
{
if(n%10==9)sum++;
}
return sum;
}
bool isr(int y)
{
if((y%4==0&&y%100!=0)||(y%400==0))
return true;
return false;
}
int mon[13]= {31,28,31,30,31,30,31,31,30,31,30,31};
int s[100005],sum[100005];
void qsum()
{
memset(s,0,sizeof(s));
memset(sum,0,sizeof(sum));
for(int i=2000; i<=9999; i++)
{
for(int j=0; j<12; j++)
{
if(isr(i)&&j==1)
s[i]+=3;
else if(!isr(i)&&j==1)
s[i]+=2;
else s[i]+=3+ha9(j+1)*30;
}
if(isr(i))s[i]+=366*ha9(i);
else s[i]+=365*ha9(i);
}
for(int i=2000; i<=9999; i++)
sum[i]+=sum[i-1]+s[i];
}
int main()
{
int t,y1,m1,d1,y2,m2,d2;
ll tol;
qsum();
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d%d%d%d",&y1,&m1,&d1,&y2,&m2,&d2);
if(y2>y1+1)
tol=sum[y2-1]-sum[y1];
else tol=0;
ll tol3,tol4;
if(y2==y1)
{
if(m1==m2){
tol3=0;
tol3+=(d2-d1+1)*(ha9(y1)+ha9(m1));
if(d1<=9){
if(d2>=9&&d2<19)tol3++;
else if(d2>=19&&d2<29)tol3+=2;
else if(d2>=29)tol3+=3;
}
else if(d1>9&&d1<=19){
if(d2>=19&&d2<29)tol3+=1;
else if(d2>=29)tol3+=2;
}
else if(d1>19&&d1<=29)
{
if(d2>=29)tol3++;
}
else if(d1>29){
tol3++;
}
}
else {
if(isr(y1))mon[1]++;
tol3=0;
int k=0;
if(d1<=9)tol3+=3;
else if(d1>9&&d1<=19)tol3+=2;
else if(d1>=19)tol3++;
tol3+=(ha9(y1)+ha9(m1))*(mon[m1-1]-d1+1);
if(m1==2&&!isr(y1))tol3--;
m1++;
while(m1<m2)
{
tol3+=3+(ha9(y1)+ha9(m1))*mon[m1-1];
if(m1==2&&!isr(y1))tol3--;
m1++;
}
if(d2>=29)tol3+=3;
else if(d2>=19)tol3+=2;
else if(d2>=9)tol3+=1;
tol3+=(ha9(y1)+ha9(m2))*d2;
if(isr(y1))mon[1]--;
}
}
else
{
if(isr(y1))mon[1]++;
tol3=0;
if(d1<=9)tol3+=3;
else if(d1>9&&d1<=19)tol3+=2;
else if(d1>19)tol3++;
tol3+=(ha9(y1)+ha9(m1))*(mon[m1-1]-d1+1);
if(m1==2&&!isr(y1))tol3--;
m1++;
while(m1<12)
{
tol3+=3+(ha9(y1)+ha9(m1))*(mon[m1-1]);
if(m1==2&&!isr(y1))tol3--;
m1++;
}
tol3+=3+(ha9(y1))*31;
if(isr(y1))mon[1]--;
if(isr(y2))mon[1]++;
int tol5=0;
if(d2<9)tol5+=0;
else if(d2>=9&&d2<19)tol5+=1;
else if(d2>=19&&d2<29)tol5+=2;
else tol5+=3;
tol5+=(ha9(y2)+ha9(m2))*d2;
m2--;
while(m2>0)
{
tol5+=3+(ha9(y2)+ha9(m2))*(mon[m2-1]);
if(m2==2&&!isr(y2))tol5--;
m2--;
}
if(isr(y2))mon[1]--;
tol3+=tol5;
}
printf("%lld\n",tol+tol3);
}
return 0;
}