zoj——某年某月某日到某年某月某日中9的个数

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值