王母娘娘又双叒叕来难为茶山牛了
题目描述
我们每个人应该都听过牛郎和织女的传说,但是你们知道吗?牛郎的真名其实叫做————茶山牛
经过茶山牛不懈的努力,王母娘娘终于同意了让他跟织女见上一面,但是必须得解决王母娘娘的一个问题。
王母娘娘给出两个数字n,m,要求茶山牛在1s内回答出 ( n ! ! ! ) % (n ! ! !) \% (n!!!)%的值(即n的阶乘的阶乘的阶乘对m取模后的值),这可真是难为茶山牛了,毕竟一心只想见到织女,所以你能帮助他解决这个问题吗?
输入描述:
多组输入,第一行一个正整数t ( 1 ≤ t ≤ 1 0 5 ) (1 \leq t \leq 10^{5}) (1≤t≤105)表示数据组数
每组数据包含两个整数n,m ( 0 ≤ n ≤ 1 0 9 , 1 ≤ m ≤ 1 0 9 ) (0 \leq n \leq 10^{9},1 \leq m \leq 10^{9}) (0≤n≤109,1≤m≤109)
输出描述:
对于每组数据,输出答案
示例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;
}