思路:
对于任意一个数N 我们都可以将之分解为 N = 7 * k + m,
所以 NN=(7∗k+m)N 通过二项展开式,我们可以得到 mN
由观察得到7作为一个质数,一定与N(除了7的倍数,但是如果这个数是7的倍数那么模完直接就为0了)互质,这样的话就满足了费马小定理的条件(p是质数,底数与p互质),所以有 mp−1=1(modp)(ps:p=7)
所以可以进一步化简为 mt 此时 0<=m <= 6 , 0<=t<=5
m和t都是以1为值增加的,所以我们可知这42种情况会循环出现。
进一步推广,虽然增加的数是没42个一循环,但是加上前边的数字就不一定了,所以,更大的循环节为42*7 = 294
#include <iostream>
#include <cstdio>
#include <string.h>
#include <queue>
#include <algorithm>
#include <map>
typedef long long int lli;
using namespace std;
int a[400];
int qp(int a,int b,int c){
int ans = 1;
for(;b;b>>=1){
if(b&1)
ans = ans * a % c;
a = a * a % c;
}
return ans;
}
char s[7][200] = {"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
int main(){
int t;
a[1] = 1;
for(int i = 2;i <= 300;i++){
a[i] = ( a[i-1] + qp(i,i,7) )% 7;
}
a[0] = a[294];
cin>>t;
int n;
int ans = 0;
while(t--){
ans = 0;
scanf("%d",&n);
printf("%s\n",s[ (6+a[n % 294]) %7]);
}
}