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

本文介绍了一种利用模指数运算和费马小定理解决特定数学问题的方法,通过对任意数N进行特定形式的分解,并运用二项式定理及费马小定理简化计算过程,实现了循环节的确定。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

思路:

对于任意一个数N 我们都可以将之分解为 N = 7 * k + m,
所以 NN=(7k+m)N 通过二项展开式,我们可以得到 mN
由观察得到7作为一个质数,一定与N(除了7的倍数,但是如果这个数是7的倍数那么模完直接就为0了)互质,这样的话就满足了费马小定理的条件(p是质数,底数与p互质),所以有 mp1=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]);
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值