题目地址:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3785
我先写一个打表程序发现周期为294,
然后用快速幂求模的模板暴力一下就过了;
有人用费马小定理把周期求出来了,不过我没大弄懂,弄明白再贴上来把。
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define min(a,b) ((a)<(b))?(a):(b)
#define max(a,b) ((a)>(b))?(a):(b)
#define INF 99999999999999999
int PowerMod(int num, int n, int mod);
int main(void)
{
int t,n,mod = 7,res = 0,i;
scanf("%d",&t);
while(t--)
{
res = 0;
scanf("%d",&n);
n = n % 294;
for(i = 1 ; i <=n ; i++)
{
res = (PowerMod(i,i,mod)%mod + res %mod)%mod;
}
res = ((6+res) %mod);
switch(res)
{
case 0 : puts("Sunday");break;
case 1 : puts("Monday");break;
case 2 : puts("Tuesday");break;
case 3 : puts("Wednesday");break;
case 4 : puts("Thursday");break;
case 5 : puts("Friday");break;
case 6 : puts("Saturday");break;
}
}
return 0;
}
int PowerMod(int num, int n, int mod)
{
int res = 1;
num = num % mod;
while(n)
{
if (n&1)
res = (res * num) % mod;
num = (num * num) % mod;
n >>= 1;
}
return res;
}