ZOJ 3785 What day is that day?

J - What day is that day?
Time Limit:2000MS    Memory Limit:65536KB    64bit IO Format:%lld & %llu

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.



做法:先暴力地把结果写入文件,在文件里面观察,然后得到规律,发现循环周期为294,之后就好办了,打一个1-294的表,之后每次去模查表就行了。

当然做法有很多,貌似还有等比数列求和的做法。把每一项的底数%7,7个排一行,会发现,上下对应的数刚好能成为等比数列,然后用等比数列的求和公式做。

个人认为我的方法算是比较快了。20ms

#include <stdio.h>
#define MOD 7
#define N 300
int table[N];
long long PowMod(long long a, long long n)
 {
       long long ret = 1;
       while(n) {
             if(n & 1) ret = ret * a % MOD;
             a = a * a % MOD;
             n >>= 1;
       }
            return ret%MOD;
 }
 void gettable()
 {
     for(int i=1;i<=294;i++)
     {
        long long sum=0;
        for(int j=1;j<=i;j++)
            sum+=PowMod(j,j)%MOD;
        table[i]=sum%MOD;
     }

 }
int main()
{
    gettable();
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n;
        scanf("%d",&n);
        int cnt=table[n%294];
        switch(cnt)
        {
            case 0:
                printf("Saturday\n");
                break;
            case 1:
                printf("Sunday\n");
                break;
            case 2:
                printf("Monday\n");
                break;
            case 3:
                printf("Tuesday\n");
                break;
            case 4:
                printf("Wednesday\n");
                break;
            case 5:
                printf("Thursday\n");
                break;
            case 6:
                printf("Friday\n");
                break;
        }
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值