数论题,关键是找规律,先把1到6的幂次对7取余的数列求出来,然后可以发现42个数是一个周期,把1到42的各自幂对7取余的数求出来,然后后面的就进入周期循环了
#include<cstdio>
#include<vector>
#include<string>
#include<iostream>
using namespace std;
namespace
{
vector<int> R[7];
void init()
{
int temp;
for (int i = 1; i < 7; i++)
{
R[i].push_back(1);
while ((temp = (R[i].back() * i) % 7) != 1)
R[i].push_back(temp);
}
}
}
int main()
{
init();
vector<int> V;
for (int i = 1; i <= 42; i++)
{
if (V.empty())
V.push_back(1);
else
{
int now = i % 7 ? R[i % 7][i % R[i % 7].size()] : 0;
V.push_back((now + V.back()) % 7);
}
}
char s[7][10] = { "Saturday", "Sunday", "Monday", "Tuesday", "Wednesday",
"Thursday", "Friday" };
int T, N;
scanf("%d", &T);
while (T--)
{
scanf("%d", &N);
int period = N / 42, other = N % 42;
int res = (period * 6 + (other ? V[other - 1] : 0)) % 7;
puts(s[res]);
}
return 0;
}