题目描述
鸡尾酒最喜欢吃东北的烤面包片了。每次到东北地区的区域赛或者是秦皇岛的wannafly camp,鸡尾酒都会吃很多的烤面包片,即使比赛打铁也觉得不枉此行。
“我想吃烤面包片!!!”这不,半年没吃烤面包片的鸡尾酒看到大家都聚集在秦皇岛参加暑假camp,羡慕地发出了想要的声音。
当鸡尾酒“想要”的时候,他说的话会带三个感叹号来表示非常“想要”。至于有多“想要”,他给了你一个算式让你来体会。
给你两个整数 nn 和 modmod,输出 n!!!n!!! 对 modmod 求余的结果(每个!! 都代表一个阶乘符号)
输入描述
输入共一行包含两个整数依序为 nn 和 modmod,意义如题面所示。(0 \le n \le 10^9,1 \le mod \le 10^90≤n≤109,1≤mod≤109)
输出描述
输出一个小于 modmod 的非负整数表示答案。
样例输入 1
2 6324
样例输出 1
2
样例输入 2
3 999999999
样例输出 2
731393874
提示
在第一个样例中,由于 2! = 22!=2,所以 2!!! = (((2!)!)!) = ((2!)!) = (2!) = 22!!!=(((2!)!)!)=((2!)!)=(2!)=2。2模了6324还是2!
所以答案为2
思路:
根据范围可得4!!一定大于1e9(事实上甚至大于1e18),所以4!!!一定能被mod整除(因为4!!!算的时候,4!!里的所有数,全都出现过,当有一个数整除了mod那么结果就是0),所以我们只需要判断n<=3的情况
#include<iostream>
using namespace std;
long long n,mod;
int main(){
cin>>n>>mod;
if(n==0){
cout<<1%mod<<endl;
}else if(n==1){
cout<<n%mod<<endl;
}else if(n==2){
cout<<n%mod<<endl;
}else if(n==3){
long long sum=1;
for(int i=1;i<=720;i++){
sum=(sum*i)%mod;
}
cout<<sum%mod<<endl;
}else{
cout<<"0"<<endl;
}
return 0;
}