大视野OJ 2186 沙拉公主的困惑(模素数的逆元连乘)
2016-05-24 00:51
381 查看
题目链接:
大视野OJ 2186 沙拉公主的困惑
题意:
求1—>n!中和m!互质的数的个数,其中m <= n.
分析:
就是按照这个Acdreamers的博客打的。ORZ。。。。
判断素数的如果用数组的话会MLE,头一次用bitset。。。。。。
大视野OJ 2186 沙拉公主的困惑
题意:
求1—>n!中和m!互质的数的个数,其中m <= n.
分析:
就是按照这个Acdreamers的博客打的。ORZ。。。。
判断素数的如果用数组的话会MLE,头一次用bitset。。。。。。
#include <iostream> #include <cstdio> #include <cstring> #include <string> #include <algorithm> #include <climits> #include <cmath> #include <ctime> #include <cassert> #include <vector> #include <bitset> #define IOS ios_base::sync_with_stdio(0); cin.tie(0); using namespace std; typedef long long ll; const int MAX_N = 10000010; int T; ll n, m, mod; bitset<MAX_N> prime; //int notprime[MAX_N]; ll fac[MAX_N], inv[MAX_N], ans[MAX_N]; void GetPrime() //notprime[i]==0 标记i为素数 { prime.set(); int m = (int)sqrt(MAX_N + 0.5); //memset(notprime, 0, sizeof(notprime)); for(int i = 2; i < m; i++){ if(prime[i]){ for(int j = i * i; j < MAX_N; j += i){ prime[j] = 0; } } } } void GetFactorial() { fac[1] = 1; for(int i = 2; i < MAX_N; i++){ fac[i] = fac[i - 1] * i % mod; } } void GetInv() //逆元inv[i] 特指i对模素数mod后除以i的结果 { inv[1] = 1; for(int i = 2; i < MAX_N; i++){ if(i > mod) break; inv[i] = (mod - mod / i) * (inv[mod % i]) % mod; } } void GetAns() { ans[1] = 1; for(int i = 2; i < MAX_N; i++){ if(prime[i]){ //i是素数 ans[i] = ans[i - 1] * (i - 1) %mod * inv[i % mod] % mod; }else { ans[i] = ans[i - 1]; } } } int main() { scanf("%d%lld", &T, &mod); GetPrime(); GetInv(); GetAns(); GetFactorial(); while(T--){ scanf("%lld%lld", &n, &m); printf("%lld\n", fac * ans[m] % mod); } return 0; }
相关文章推荐
- 1.m分解阶乘之和
- 2.几种递推数
- 3.欧拉函数
- 4.快速幂模m算法
- 5.扩展欧几里得&&中国剩余定理
- 6.数论_web
- Project Euler Problem 387 - Harshad Numbers - 深度优先
- 编程之美2015初赛A
- 数论题集
- 原根
- 阶与原根学习笔记
- HDU 1299 Diophantus of Alexandria
- Leftmost Digit(HDU 1060)
- Rightmost Digit(HDU 1061)
- Python-在奇数中寻找素数
- ZOJ 2674 Strange Limit 欧拉定理
- LeetCode-Palindrome Number
- 组合数求模总结
- Sicily 1047 Super Snooker
- 【数论】组合数求模