ZOJ-3785

来源:互联网 发布:seo主管 编辑:程序博客网 时间:2024/06/05 11:40

数论题,关键是找规律,先把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;}


0 0