nowcoder 王母娘娘又双叒叕来难为茶山牛了 (数学题)

王母娘娘又双叒叕来难为茶山牛了
题目描述

我们每个人应该都听过牛郎和织女的传说,但是你们知道吗?牛郎的真名其实叫做————茶山牛
经过茶山牛不懈的努力,王母娘娘终于同意了让他跟织女见上一面,但是必须得解决王母娘娘的一个问题。
王母娘娘给出两个数字n,m,要求茶山牛在1s内回答出 ( n ! ! ! ) % (n ! ! !) \% (n!!!)%的值(即n的阶乘的阶乘的阶乘对m取模后的值),这可真是难为茶山牛了,毕竟一心只想见到织女,所以你能帮助他解决这个问题吗?

输入描述:

多组输入,第一行一个正整数t ( 1 ≤ t ≤ 1 0 5 ) (1 \leq t \leq 10^{5}) (1t105)表示数据组数
每组数据包含两个整数n,m ( 0 ≤ n ≤ 1 0 9 , 1 ≤ m ≤ 1 0 9 ) (0 \leq n \leq 10^{9},1 \leq m \leq 10^{9}) (0n109,1m109)

输出描述:

对于每组数据,输出答案

示例1
输入

2
2 6553
2 2

输出

2
0

在样例中,(2 ! ! !) = 2,对6553取模为2

解题思路分析


  • 0! = 1 1!= 1
  • 2! = 2
  • 考虑到4! = 24, 而24!已经远大于1e9,而m的取值是最大才是1e9, 因此24!!会存在m是它的因子,因此当n大于等于4的情况下,对m取模一定是0(因为可以整除m);
  • 考虑3!!720,而720!是否可以整除m,需要利用乘法取模公式 ( a × b ) % m = ( ( a % m ) × ( b % m ) ) % m (a\times b)\%m = ((a\%m)\times(b\%m))\%m (a×b)%m=((a%m)×(b%m))%m不断取模进行判断,因为直接计算会溢出。

#include<iostream>
#include<vector>
#include<string>
#include<map>
#include<algorithm>
#include<queue>
#include<stack>
#include<cstring>
#include<unordered_map>
#include<numeric>
using namespace std;

#define DEBUG(x) cout << "#: " << (x) << endl; 
typedef long long LL;
const int MOD = 1e9 + 7;


int main(){
    int T; cin >> T;
    while(T--){
        int n,m; cin >> n >> m;
        if(n == 0 || n == 1) cout << 1 % m << endl;
        else if(n == 2) cout << 2 % m << endl;
        else if(n == 3) {
            LL ans = 1;
            for(LL i = 2; i <= 720; i++) // ((3!)!) = 720 
                ans = (ans * i) % m; //(a*b)%m = (a%m) * (b%m) % m
            cout << ans % m << endl;
        }
        else cout<< 0 << endl;  //n >= 4的情况
    }

    return 0;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值