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.
先暴力打出前50个结果,N^N发现存在长度为42的循环节,然后直接搞。另外直接写一个快速幂也能过。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <bitset>
#include <algorithm>
using namespace std;
#define N 50
#define INF 0x3f3f3f3f
#define LL long long
int a[N],sum[N];
char st[10][10]={"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};
int pow(int a,int b,int n){
int ret=1;
for (int i=0;i<b;i++){
ret*=a;
ret=ret%n;
}
return ret;
}
int main(){
sum[0]=0;
for (int i=1;i<=50;i++){
a[i]=pow(i,i,7);
sum[i]=(sum[i-1]+a[i])%7;
//cout<<i<<' '<<a[i]<<endl;
}
a[0]=a[42];
int T,n,now=6;
scanf("%d",&T);
while (T--){
scanf("%d",&n);
int S,MOD;
S=n/42;
MOD=n%42;
int add=(S*sum[42])%7;
//cout<<S<<' '<<MOD<<' '<<add<<' '<<sum[MOD]<<endl;
printf("%s\n",st[(now+add+sum[MOD])%7]);
}
return 0;
}