123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- #include <bits/stdc++.h>
- using namespace std;
- int a[10] = {6, 2, 5, 5, 4, 5, 6, 3, 7, 6};
- int typeMonth(int m){
- int ret = 0;
- switch (m){
- case 1:
- case 3:
- case 5:
- case 7:
- case 8:
- case 10:
- case 12:
- ret = 1;
- break;
- case 4:
- case 6:
- case 9:
- case 11:
- ret = 0;
- break;
- case 2:
- ret = -1;
- break;
- }
- return ret;
- }
- bool isPrime(int y){
- if(y % 400 == 0)return true;
- if(y % 4 == 0 && y % 100 != 0)return true;
- return false;
- }
- struct Node{
- int y, m, d;
- Node(){}
- Node(int y, int m, int d):y(y), m(m), d(d){}
- bool operator<(const Node& o){
- if(y != o.y)return y < o.y;
- if(m != o.m)return m < o.m;
- return d < o.d;
- }
- void addOneDay(){
- int ny = y;
- int nm = m;
- int nd = d+1;
- if(typeMonth(m)==1){
- if(d == 31){
- nd = 1;
- nm++;
- if(nm==13){
- ny ++;
- nm = 1;
- }
- }
- }else if(typeMonth(m)==0){
- if(d == 30){
- nd = 1;
- nm++;
- }
- }else{
- if(isPrime(y)){
- if(d == 29){
- nd = 1;
- nm++;
- }
- }else {
- if(d == 28){
- nd = 1;
- nm ++;
- }
- }
- }
- y = ny;
- m = nm;
- d = nd;
- }
- int getNumber(){
- return a[y/1000] + a[y%1000/100] + a[y%100/10] + a[y%10] + a[m/10] + a[m%10] + a[d/10] + a[d%10];
- }
- };
- int n;
- string s;
- Node Stime,Etime;
- int main() {
- int t;
- cin >> t;
- while(t--){
- cin >> s;
- cin >> n;
- int y = (s[0]-'0')*1000 + (s[1]-'0')*100 + (s[2]-'0')*10 + (s[3]-'0');
- int m = (s[4]-'0')*10 + (s[5]-'0');
- int d = (s[6]-'0')*10 + (s[7]-'0');
- Stime = Node(y, m, d);
- Etime = Node(3000, 01, 01);
- int i = 0;
- bool f = false;
- while(Stime < Etime){
- if(Stime.getNumber() == n){
- f = true;
- cout << i << endl;
- break;
- }
- i++;
- Stime.addOneDay();
- }
- if(!f){
- cout << -1 << endl;
- }
- }
- }
|