您的位置:首页 > 其它

ZOJ 3785 What day is that day? (数论 循环节)

2017-02-16 10:52 381 查看

思路:

对于任意一个数N 我们都可以将之分解为 N = 7 * k + m,

所以 NN=(7∗k+m)N 通过二项展开式,我们可以得到 mN

由观察得到7作为一个质数,一定与N(除了7的倍数,但是如果这个数是7的倍数那么模完直接就为0了)互质,这样的话就满足了费马小定理的条件(p是质数,底数与p互质),所以有 mp−1=1(modp)(ps:p=7)

所以可以进一步化简为 mt 此时 0<=m <= 6 , 0<=t<=5

m和t都是以1为值增加的,所以我们可知这42种情况会循环出现。

进一步推广,虽然增加的数是没42个一循环,但是加上前边的数字就不一定了,所以,更大的循环节为42*7 = 294

#include <iostream>
#include <cstdio>
#include <string.h>
#include <queue>
#include <algorithm>
#include <map>

typedef long long int lli;
using namespace std;

int a[400];

int qp(int a,int b,int c){
int ans = 1;
for(;b;b>>=1){
if(b&1)
ans = ans * a % c;
a = a * a % c;
}
return ans;
}

char s[7][200] = {"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"};

int main(){
int t;
a[1] = 1;
for(int i = 2;i <= 300;i++){
a[i] = ( a[i-1] + qp(i,i,7) )% 7;
}
a[0] = a[294];
cin>>t;
int n;
int ans = 0;
while(t--){
ans = 0;
scanf("%d",&n);
printf("%s\n",s[ (6+a[n % 294]) %7]);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: