牛客七夕 B 王母娘娘又双叒叕来难为茶山牛了 题解

题目大意

给你n和m,求$(n!!!)% m$。

解题思路

昨天七夕玩了一天,回家都累死了。

晚上就简单的看了看,wa了几次,就没写了。

后来仔细想了想,发现思路没错,最后忘求阶乘了。

太丢人了。。

首先我们可以把$(n!!)$看做$t$,就变成了$t!% m$。

如果$t\ge m$,那么答案必定是0。

所以我们只需要计算前两次,判断会不会大于等于m,注意,可能会爆ll,所以,还需要考虑溢出为负数的情况。

如果大于等于m,就输出0。

否则,最后计算$(t!)% m$即可。

补充:看了题解之后,才发现这个题目有更简单的方法,$0!!!=1,1!!!=1,2!!!=2,3!!=720,4!!>1e9$,大于3之后就必定是0了,其他情况就自己算即可。

(更丢人了。。

完整代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <queue>
#include <cstring>
#include <cmath>
#include <stack>
#include <map>
#include <list>
#include <string>
#include <vector>
#include <algorithm>
#include <sstream>
#include <unordered_map>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;

int main() {
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
//freopen("D:\\测试用\\in.txt", "r", stdin);
//freopen("D:\\测试用\\out.txt", "w+", stdout);
int t; cin >> t;
while(t--){
int n,m; cin>>n>>m;
ll ans = n,g = n;
int flag = 0;
if(n==1||n==0){
cout<<1%m<<endl;
continue;
}
for(int i = 1;i <= 2;i++){
int tmp = ans -1;
while(tmp){
if(ans<0||ans>=m){
flag = 1;break;
}
ans*=tmp--;
}
if(flag) break;
}
if(flag) cout<<0<<endl;
else {
int tmp = ans - 1;
while(tmp){
ans%=m;
ans*=tmp--;
}
cout<<ans%m<<endl;
}
}
return 0;
}
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • © 2015-2021 sakurakarma
  • Powered by Hexo Theme Ayer
  • PV: UV:

请我喝杯咖啡吧~

支付宝
微信