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.
题意:t次操作,每次输入一个数n,问:现在是星期六,在1的一次方、2的2次方....n的n次方天数之后,是星期几?
思路:一开始是考虑到求通式看到n是1e9得到同时是n*(n+1)*(2*n+1)/6;会超longlong,但是分开写的话wa了,看到n特别大,就打表试了一下到100,没发现但是先算出1-5的值,再在后面的数再出现这5个连续的值停止,看一下是否出现循环节。
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+1100;
int a[maxn];
typedef long long ll;
ll qpow(ll a,ll b)
{
ll ans=1;
while(b)
{
if(b&1) ans*=a;
a*=a;
b/=2;
a%=7;
ans%=7;
}
return ans;
}
int b[maxn];
int main(){
int t;
cin>>t;
ll sum=0;
for(int i=1;i<=1000;i++)
{
sum=0;
for(int j=1;j<=i;j++)
{
sum+=qpow(j,j)%42;
}
sum%=7;
b[i]=sum;
}
while(t--)
{
ll n;
cin>>n;
sum=0;
ll x=n%294;
sum=b[x];
int ans=0;
// for(int i=1;i<=n;i++)
// {
// cout<<b[i]<<endl;
// if(i!=1&&b[i]==1&&b[i+1]==5&&b[i+2]==4&&b[i+3]==1&&b[i+4]==4&&b[i+5]==5)
// {
// cout<<i<<endl;
// break;
// }
// }
if(sum==0) cout<<"Saturday"<<endl;
else if(sum==6) cout<<"Friday"<<endl;
else if(sum==5) cout<<"Thursday"<<endl;
else if(sum==4) cout<<"Wednesday"<<endl;
else if(sum==3) cout<<"Tuesday"<<endl;
else if(sum==2) cout<<"Monday"<<endl;
else cout<<"Sunday"<<endl;
}
return 0;
}