王母娘娘又双叒叕来难为茶山牛了(C++)

题目描述

我们每个人应该都听过牛郎和织女的传说,但是你们知道吗?牛郎的真名其实叫做————茶山牛

经过茶山牛不懈的努力,王母娘娘终于同意了让他跟织女见上一面,但是必须得解决王母娘娘的一个问题。

王母娘娘给出两个数字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
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;
	}
}

你可能感兴趣的:(算法,c++)