首页 > 代码库 > 2014 Super Training #4 G What day is that day? --两种方法

2014 Super Training #4 G What day is that day? --两种方法

原题: ZOJ 3785 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3785

题意:当天是星期六,问经过1^1+2^2+3^3....+n^n天后是星期几?

这题开始以为是这种式子的求和问题,翻了半天没翻到公式。结果没搞出来。后来发现有两种方法。

第一种方法: 找规律

打表可以看出,这些数的结果出现42一循环,所以直接就处理出前42个,后面的就用前面的。

代码:

#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <algorithm>#include <string>using namespace std;#define N 20007int sum[44];string ss[8] = {"Saturday","Sunday","Monday","Tuesday","Wednesday","Thursday","Friday"};void init(){    int n,i,j;    sum[0] = 0;    for(n=1;n<=44;n++)    {        int flag = n%7;        int ans = 1;        for(j=1;j<=n;j++)            ans = (ans*flag)%7;        sum[n] = ans;    }    for(i=1;i<=44;i++)        sum[i] += sum[i-1];}int main(){    int i,j,t,n,ans;    init();    scanf("%d",&t);    while(t--)    {        scanf("%d",&n);        ans = (((n/42)%7*(sum[42]%7))%7 + sum[n%42]%7)%7;        cout<<ss[ans]<<endl;    }    return 0;}
View Code

 

第二种方法: 矩阵乘法

有待更新