Problem:
C: Digital Clock / デジタル時計

物語

あいずにゃんは最近，風邪を引いてしまった．あまりのだるさにベットから出られない．辛そうにしている姿もまたかわいい．

しかし暇で暇で仕方がないあいずにゃんは，枕下にあるデジタル時計で遊ぶ方法を考えついた．下の図のようなデジタル時計の光っている棒の本数を毎秒毎秒，ただひたすらに数えるのである．

何時間かこの遊びを続けた頃，あいずにゃんは時間が違っていても光っている棒の本数が等しい場合があることに気づいた．光っている棒の本数が等しい時間が何通りあるのか気になったあいずにゃんは，看病中のあなたに数えてくれるようお願いしてきた．

ベッドから出られないあいずにゃんのために，あなたはプログラムを書いて求めることにした．

問題

年月日，および時分秒を表示する上図のようなデジタル時計がある．光っている棒の本数がちょうど N 本になる年月日時分秒が何通りあるか答えよ．ただし，デジタル時計は一部壊れているため，絶対光らない棒が何箇所かある．光らない棒によって同じ表示に見える場合でも，表示しようとした年月日時分秒が異なる場合は別に数えることに注意せよ．

各数字の光る箇所は次の図に示す通りである．

デジタル時計は西暦を0詰め4桁（0000年〜9999年），月，日，時，分，秒をそれぞれ0詰め2桁で表示する．

月は1日から始まり，4, 6, 9, 11月は30日まで，1, 3, 5, 7, 8, 10, 12月は31日までである．2月は通常28日までだが，閏年には29日までとなる．ここで閏年とは，次のような年である．

西暦が400で割り切れる年は閏年である．

西暦が400で割り切れないが，100で割り切れる年は閏年ではない．

西暦が100で割り切れないが，4で割り切れる年は閏年である．

西暦が4で割り切れない年は閏年ではない．

時間は0時から23時まで，分は0分から59分まで，秒は0秒から59秒までである．閏秒に関しては考えなくてよい．

入力形式

1行目に光っている棒の本数 N (0 ≤ N ≤ 98) が与えられる．

2行目に壊れて光らない箇所の個数 K (0 ≤ K ≤ 98) が与えられ，続いて K 行に壊れている箇所の情報が与えられる．K 行のうち i 行目には，i 番目の壊れている棒の桁 p_i (0 ≤ p_i ≤ 13) と位置 q_i (0 ≤ q_i ≤ 6) が空白区切りで与えられる．

桁とは，次の図のようなデジタル時計の各数字に割り当てられたIDであり，上位の数字から順に0から13までを割り当てた番号のことである．

また，棒の位置とは次の図のような各数字中における棒のIDであり，上の棒から順に0から6までの数字を割り当てた番号のことである．

出力形式

光っている棒の本数がちょうど N 本になる年月日時分秒の総数を1行に出力せよ．

入力例1

28
0

出力例1

1

1111年11月11日11時11分11秒の1通りである．

入力例2

28
1
2 0

出力例2

2

1171年11月11日11時11分11秒 と 1111年11月11日11時11分11秒 の2通りである．

入力例3

98
1
3 0

出力例3

0

入力例4

60
1
3 0

出力例4

13362470370

Solution in C++ (judge verdict: Wrong Answer)

#define _USE_MATH_DEFINES
#define INF 0x3f3f3f3f

#include <iostream>
#include <cstdio>
#include <sstream>
#include <cmath>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <stack>
#include <limits>
#include <map>
#include <string>
#include <cstring>
#include <set>
#include <deque>
#include <bitset>
#include <list>
#include <cctype>
#include <utility>
  
using namespace std;
  
typedef long long ll;
typedef pair <int,int> P;
typedef pair <int,P> PP;
  
static const double EPS = 1e-8;
  
static const int tx[] = {0,1,0,-1};
static const int ty[] = {-1,0,1,0};

ll digit2bar[14][10] = 
  {
    {6,2,5,5,4,5,6,3,7,6},
    {6,2,5,5,4,5,6,3,7,6},
    {6,2,5,5,4,5,6,3,7,6},
    {6,2,5,5,4,5,6,3,7,6},
    {6,2,5,5,4,5,6,3,7,6},
    {6,2,5,5,4,5,6,3,7,6},
    {6,2,5,5,4,5,6,3,7,6},
    {6,2,5,5,4,5,6,3,7,6},
    {6,2,5,5,4,5,6,3,7,6},
    {6,2,5,5,4,5,6,3,7,6},
    {6,2,5,5,4,5,6,3,7,6},
    {6,2,5,5,4,5,6,3,7,6},
    {6,2,5,5,4,5,6,3,7,6},
    {6,2,5,5,4,5,6,3,7,6}
  };


enum Type {
  YEAR = 4,
  MONTH = 2,
  DAY = 2,
  HOUR = 2,
  MINUTE = 2,
  SECOND = 2
};

bool is_leap_year(int year){
  if(year % 400 == 0) return true;
  if(year % 400 != 0 && year % 100 == 0) return false;
  if(year % 100 !=0 && year % 4 == 0) return true;
  if(year % 4 != 0) return false;
  return false;
}

ll digits2bar(int digits,Type type,int offset){
  ll res = 0;
  for(int i = 0; i < type; i++){
    res += digit2bar[offset][digits % 10];
    digits /= 10;
    offset--;
  }
  return res;
}

int main(){
  vector<int> bar_pos2digit[8];
  bar_pos2digit[0].push_back(0);
  bar_pos2digit[0].push_back(2);
  bar_pos2digit[0].push_back(3);  
  bar_pos2digit[0].push_back(5);  
  bar_pos2digit[0].push_back(6);
  bar_pos2digit[0].push_back(7);
  bar_pos2digit[0].push_back(8);
  bar_pos2digit[0].push_back(9);

  bar_pos2digit[1].push_back(0);
  bar_pos2digit[1].push_back(4);
  bar_pos2digit[1].push_back(5);
  bar_pos2digit[1].push_back(6);
  bar_pos2digit[1].push_back(8);
  bar_pos2digit[1].push_back(9);

  bar_pos2digit[2].push_back(0);
  bar_pos2digit[2].push_back(1);
  bar_pos2digit[2].push_back(2);
  bar_pos2digit[2].push_back(3);
  bar_pos2digit[2].push_back(4);
  bar_pos2digit[2].push_back(7);
  bar_pos2digit[2].push_back(8);
  bar_pos2digit[2].push_back(9);

  bar_pos2digit[3].push_back(2);
  bar_pos2digit[3].push_back(3);
  bar_pos2digit[3].push_back(4);
  bar_pos2digit[3].push_back(5);
  bar_pos2digit[3].push_back(6);
  bar_pos2digit[3].push_back(8);
  bar_pos2digit[3].push_back(9);

  bar_pos2digit[4].push_back(0);
  bar_pos2digit[4].push_back(2);
  bar_pos2digit[4].push_back(6);
  bar_pos2digit[4].push_back(8);

  bar_pos2digit[5].push_back(0);
  bar_pos2digit[5].push_back(3);
  bar_pos2digit[5].push_back(4);
  bar_pos2digit[5].push_back(5);
  bar_pos2digit[5].push_back(6);
  bar_pos2digit[5].push_back(7);
  bar_pos2digit[5].push_back(8);
  bar_pos2digit[5].push_back(9);

  bar_pos2digit[6].push_back(0);
  bar_pos2digit[6].push_back(2);
  bar_pos2digit[6].push_back(3);
  bar_pos2digit[6].push_back(5);
  bar_pos2digit[6].push_back(6);
  bar_pos2digit[6].push_back(8);
  bar_pos2digit[6].push_back(9);

  int num_of_lightning_bars;
  while(~scanf("%d",&num_of_lightning_bars)){
    int num_of_broken_bars;
    scanf("%d",&num_of_broken_bars);
    for(int i = 0; i < num_of_broken_bars; i++){
      int digit_pos;
      int bar_pos;
      scanf("%d %d",&digit_pos,&bar_pos);
      for(int j = 0; j < bar_pos2digit[bar_pos].size(); j++){
        int digit = bar_pos2digit[bar_pos][j];
        digit2bar[digit_pos][digit]--;
      }
    }
    
    ll dp[7][110] = {};    
    for(int year = 0; year <= 9999; year++){
      int days[] = {0,31,28 + (is_leap_year(year) ? 1 : 0),31,30,31,30,31,31,30,31,30,31};
      for(int month = 1; month <= 12; month++){
        for(int day = 1; day <= days[month]; day++){
          dp[0][digits2bar(year,YEAR,3) + digits2bar(month,MONTH,5) +digits2bar(day,DAY,7)]++;
        }
      }
    }
    
    for(int hour = 0; hour < 24; hour++){
      for(int prev = 0; prev <= 100; prev++){
        dp[1][prev + digits2bar(hour,HOUR,9)] += dp[0][prev];
      }
    }

    for(int minute = 0; minute < 60; minute++){
      for(int prev = 0; prev <= 100; prev++){
        dp[2][prev + digits2bar(minute,MINUTE,11)] += dp[1][prev];
      }
    }
    for(int second = 0; second < 60; second++){
      for(int prev = 0; prev <= 100; prev++){
        dp[3][prev + digits2bar(second,SECOND,13)] += dp[2][prev];
      }
    }
    printf("%lld\n",dp[3][num_of_lightning_bars]);
  }
}