转:https://blog.csdn.net/menxiaoyuan/article/details/50451719 了解了如何去找循环节 What day is that day? 题解:
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;
- }
pre>
</div>
</div>