题目描述
我们每个人应该都听过牛郎和织女的传说,但是你们知道吗?牛郎的真名其实叫做————茶山牛
经过茶山牛不懈的努力,王母娘娘终于同意了让他跟织女见上一面,但是必须得解决王母娘娘的一个问题。
王母娘娘给出两个数字n,m,要求茶山牛在1s内回答出(n!!!)%m(n ! ! !) \% m(n!!!)%m的值(即n的阶乘的阶乘的阶乘对m取模后的值),这可真是难为茶山牛了,毕竟一心只想见到织女,所以你能帮助他解决这个问题吗?
输入描述:
多组输入,第一行一个正整数t(1≤t≤1051 \leq t \leq 10^{5}1≤t≤105)表示数据组数
每组数据包含两个整数n,m(0≤n≤109,1≤m≤1090 \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
思路:
1、注意的是当4!!!等于24!!。而24!已经远远大于1e9,所以24!!肯定含有因子m。
2、0!=1 , 1!=1,所以n等于0或1的时候,取模为1%m。2!=2,所以n等于2的时候为2%m。
3、所以只需要对n等于3的时候进行分析,这里知道一个公式(a*b)%m=((a%m)*(b%m)%m。3的!!等于720,所以遍历第三个!,即720!。
代码:
#include<iostream>
using namespace std;
int main()
{
int t;
cin >> t;
while (t--)
{
int n, m;
cin >> n >> m;
if (n == 0) cout << 1 % m << endl;
else if (n == 1 || n == 2) cout << n % m << endl;
else if (n == 3)
{
long long sum = 1;
for (int i = 1; i <= 720; i++)
{
sum = (sum % m) * (i % m);
}
cout << sum%m << endl;
}
else if(n >= 4)
cout << 0 << endl;
}
}