鏈接:https://ac.nowcoder.com/acm/contest/342/A
來源:牛客網
題目描述
筱瑪是個快樂的男孩子。
寒假終於到了,筱瑪決定請他的朋友們一起來快樂。
對於筱瑪來說,最快樂的事情莫過於翻看萬年曆上的日期了。
一個日期是“快樂”的,當且僅當這一年的年份是一個質數,且將月份、日期寫成"MM-DD"的形式後是對稱的。如:"2003-01-10"是“快樂”的。
筱瑪有n個小夥伴,每個小夥伴都會提出一個問題,即:從"2000-01-01"這一天開始,第k個“快樂”的日期是什麼。
輸入描述:
第一行一個整數n。
接下來n行,每行一個數字k,表示一次詢問。
輸出描述:
輸出共n行,每行一個形如"YYYY-MM-DD"的日期表示答案。
示例1
輸入
複製
3
1
23
48
輸出
複製
2003-01-10
2027-11-11
2063-12-21
備註:
1≤n≤106
保證答案存在且答案年份爲4位數。
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
const int maxn = 1e5;
int tot; ///質數數組下標,數着質數個數
int pri[maxn]; ///質數數組
bool is[maxn]; ///定義一個bool類型數組,存放範圍內的數,後來全初始化爲1
void get_prime()
{
tot = 0;
memset(is, 1, sizeof(is)); ///bool類型數組全部初始化爲1(默認全爲質數)
is[0] = is[1] = 0;
for(int i = 2; i <= 9997; ++i) ///遍歷數組
{
if(is[i]) ///若範圍數組中此數未被標爲0,則其未被前面質數篩掉,屬於質數,用它去篩後面的數
{
pri[++tot] = i; ///(1)將此數存於質數數組 pri[0]裏沒存數字
for(int j = i + i; j <= 9997; j += i) ///(2)從其2倍開始篩
{
is[j] = 0;
}
}
}
}
int main()
{
get_prime();
// for(int i = 1; i <= tot; ++i)
// {
// if(2003 == pri[i])
// {
// cout << i << '\n';
// cout << pri[i] << '\n';
// }
// }
int n;
while(~scanf("%d", &n))
{
for(int i = 0; i < n; ++i)
{
int a;
scanf("%d", &a);
int tem1 = (a - 1) / 6;
cout << pri[304 + tem1] << '-';
int tem2 = a % 6;
switch(tem2)
{
case 0:
cout << "12-21" << '\n';
break;
case 1 :
cout << "01-10" << '\n';
break;
case 2 :
cout << "02-20" << '\n';
break;
case 3 :
cout << "03-30" << '\n';
break;
case 4 :
cout << "10-01" << '\n';
break;
case 5 :
cout << "11-11" << '\n';
break;
}
}
}
return 0;
}