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 <stdio.h>
#include <string.h>
using namespace std;
int s[1000];
int f[1000];
int work(int n)
{
int sum=1;
for(int i=1;i<=n;i++){
sum=sum*n;
sum%=7;
}
return sum;
}
void init()
{
s[0]=0;
for(int i=1; i<1000;i++){
s[i]=s[i-1]+work(i);
s[i]%=7;
}
}
void Getrep(int *s,int *f)//查找最小循环节
{
int j=0;
f[0]=0;f[1]=0;
for(int i=1;i<1000;i++)
{
int j=f[i];
while(j&&s[i]!=s[j])
j=f[j];
f[i+1]=s[i]==s[j]?j+1:0;
}
j=0;
for(int i=1;i<1000;i++)
{
while(j&&s[i]!=s[j])
{
j=f[j];
}
if(s[i]==s[j])
j++;
if(j&&(i+1)%(i+1-j)==0)
{
printf("%d\n",i+1-j);
break;
}
}
}
int main()
{
init();
Getrep(s,f);
return 0;
}
即可求出循环节为294,接下来就简单了。
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
int s[295];
char st[10][12]={"Saturday","Sunday","Monday","Tuesday","Wednesday","Thursday", "Friday" };
int work(int n)
{
int sum=1;
for(int i=1;i<=n;i++){
sum=sum*n;
sum%=7;
}
return sum;
}
void init()
{
s[0]=0;
for(int i=1;i<295;i++){
s[i]=s[i-1]+work(i);
s[i]%=7;
}
}
int main()
{
init();
int t,n;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
n%=294;
printf("%s\n",st[s[n]]);
}
return 0;
}
.
注意点:别用cin和cout!!!