Description
It's Saturday today, what day is it after 11 + 22 + 33 + ... + NN days?
Input
There are multiple test cases. The first line of input contains an integer T indicating the number of test cases. For each test case:
There is only one line containing one integer N (1 <= N <= 1000000000).
Output
For each test case, output one string indicating the day of week.
Sample Input
2 1 2
Sample Output
Sunday Thursday
Hint
A week consists of Sunday, Monday, Tuesday, Wednesday, Thursday, Friday and Saturday.
//打表代码--找循环节
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 11000;
int a[maxn], b[maxn], f[maxn];
int main(){
int t, i, j, n;
int sum, x, cnt, ad;
while(cin>>t){
while(t--){
//cin>>n;
sum = 0;
memset(a, 0, sizeof(a));
memset(b, 0, sizeof(b));
memset(f, 0, sizeof(f));
for(n = 1; n <= 10005; n++){
x = 1;
for(i = 1; i <= n; i++){
x = x*n;
x = x%7; //因为数会非常大,所以利用公式,取余
}
sum += x;
sum = sum%7; //因为数会非常大,所以利用公式,取余
a[n] = sum; //把所有结果存入a数组
}
cnt = 1;
for(i = 1; i <= 10000; i++){
if(a[i]==1)
{
b[cnt++] = i; //把结果为1的序号 存入b
f[i] = 1;
}
/*cout<<a[i];
if(i%294==0)
cout<<endl<<endl;*/
}
for(i = 2; i < cnt; i++){
ad = b[i]-1; //每一个 的间隔
for(j = 1; j <= 6; j++) //如果照这个间隔向后推 几次,还是符合间隔的话,就找到了循环节
{
if(f[b[i]+ad*j] != 1)
break;
}
if(j==7){
cout<<b[i]<<endl;
break;
}
}
}
}
return 0;
}
//ac代码
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int e[300];
char s[10][20]={"Saturday","Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday"};
int main(){
int T,n,i,j,x,sum=0;
for(i=1;i<=294;i++){
x=1;
for(j=1;j<=i;j++){
x*=i;
x%=7;
}
sum+=x;
sum%=7;
e[i]=sum;
}
cin >> T;
while(T--){
cin >> n;
n%=294;
if(n==0) n=294;
cout << s[e[n]] << endl;
}
return 0;
}