題目描述
如果把一年之中的某個時間寫作 a 月 b 日 c 時 d 分 e 秒的形式,當這五個數都為質數時,我們把這樣的時間叫做質數時間,現已知起始時刻是 2022 年的 a 月 b 日 c 時 d 分 e 秒,終止時刻是 2022 年的 u 月 v 日 w 時 x 分 y 秒,請你統計在這段時間中有多少個質數時間?
輸入
輸入共 (2?T+1) 行。第一行一個整數 T ,代表共有 T 組查詢。
接下來2?T 行,對于每組查詢,先輸入一行五個整數a、b、c、d、e ,代表起始時刻是 a 月 b 日 c 時 d 分 e 秒。再輸入一行五個整數u、v、w、x、y,代表終止時刻是 u 月 v 日 w 時 x 分 y 秒。
對于每組查詢保證輸入的起始時刻不晚于終止時刻。輸出
輸出共 T 行,一行一個整數,表示對于每組查詢輸入統計到的從 a 月 b 日 c 時 d 分 e 秒到 u 月 v 日 w 時 x 分 y 秒中質數時間的個數。多組查詢結果用換行分隔。
樣例輸入
復制
3 3 3 3 3 0 3 3 3 5 59 7 2 6 45 32 7 29 15 30 54 2 6 2 45 32 12 3 16 56 8
樣例輸出
復制
34 24276 127449
提示
對于所有數據,保證1≤T≤10^5 且1≤a,u≤12, 1≤b, 1≤b,v≤31, 0≤c,w<24, 0≤d,x<60 ,0≤e,y<60。
我的午飯!。。。。
好吧就是預處理暴力,是誰在遞歸寫時間進制是誰啊
代碼?
#include<bits/stdc++.h>
using namespace std;
const int N=3.2e7;
int t;
int k[]{0,31,28,31,30,31,30,31,31,30,31,30,31};
vector<int>who(N,0);
vector<int>prim;
void creat(){for(int i=2;i<=60;++i){int f=0;for(int j=2;j<=sqrt(i);++j){if(i%j==0){f=1;break;}}if(!f)prim.push_back(i);}
}int time(int y,int d,int h,int m,int s){int x=d;for(int i=1;i<y;++i)x+=k[i];return ((x*24+h)*60+m)*60+s;
}void jab(){int month[]{2,3,5,7,11};int day[]{2,3,5,7,11,13,17,19,23,29,31};int hour[]{2,3,5,7,11,13,17,19,23};for(auto a:month){for(int b=0;b<11&&day[b]<=k[a];++b){for(auto c:hour){for(auto d:prim)for(auto e:prim)who[time(a,day[b],c,d,e)]++;}}}for(int i=1;i<N;++i)who[i]+=who[i-1];
}int main()
{ios::sync_with_stdio();cin.tie(nullptr);cout.tie(nullptr);cin>>t;creat();jab();while(t--){int a[6],b[6];for(int i=0;i<5;++i)cin>>a[i];for(int i=0;i<5;++i)cin>>b[i];int x=time(a[0],a[1],a[2],a[3],a[4]);int y=time(b[0],b[1],b[2],b[3],b[4]);cout<<who[y]-(x>0?who[x-1]:0)<<'\n'; }return 0;
}