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.
题解:
由于N特别大,暴力肯定不行,就打表找规律,打了n^n对7取模后的表,发现42是个循环节,这样就好解决了,将一个周期的值加起来,这样算有多少个周期再加上周期外的值就可以了。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
string s[7]={"Saturday","Sunday","Monday","Tuesday","Wednesday","Thursday","Friday"};
int a[45];
int main()
{
a[0]=0;
for(int i=1;i<=42;i++)//打一个周期的表
{
int ans=1;
for(int j=1;j<=i;j++)
{
ans=(ans*i)%7;
}
a[i]=(a[i-1]+ans)%7;
}
a[0]=a[42];
int t;
scanf("%d",&t);
while(t--)
{
long long n,temp;
scanf("%I64d",&n);
temp=((n/42)*a[0])%7;//算前面可以凑成周期的值
if(n%42!=0)
temp=(temp+a[n%42])%7;//周期外的值
cout<<s[temp]<<endl;
}
return 0;
}