预处理
最编程
2024-04-08 18:55:42
...
1.算法原理介绍
- 当数据范围扩大时,上面的方法一明显太慢超时,于是我们可以从另一个角度出发,我们可以先将公式 C a b C_{a}^{b} Cab = a ! ( a − b ) ! ∗ b ! \frac{a!}{(a - b)! * b!} (a−b)!∗b!a!中的每个部分预处理出来,即用 fact[ a ] 记录 a!,用infact[ b ] 记录b的逆元,即 b − 1 b^{-1} b−1。
- 前置知识:快速幂求逆元
- 快速幂:用于在logk的时间内快速求
a
k
a^k
ak的方法。
原理介绍: a k a^k ak = a x a^x ax * a y a^y ay * a z a^z az … 例如 a 9 a^9 a9 = a 8 a^8 a8 * a 1 a^1 a1。我们可以发现,一个数x可以转化为二进制的形式,即我们可以用 a 1 a^1 a1、 a 2 a^2 a2、 a 4 a^4 a4、 a 8 a^8 a8…来表示出任意一个数 a k a^k ak,快速幂代码如下所示:ll qmi(int a, int k, int p){ ll res = 1; while(k){ if(k & 1) res = (ll) res * a % p; k >>= 1; a = (ll) a * a % p; } return res; }
- 快速幂求逆元:快速幂的一种简单应用,其中还用到了费马小定律:如果p是一个质数,而整数a不是p的倍数,则有a^(p-1)≡1(mod p)。
2. 实例
描述:
给定 n 组询问,每组询问给定两个整数 a,b,请你输出 Cbamod(109+7) 的值。
输入格式
第一行包含整数 n。
接下来 n 行,每行包含一组 a 和 b。
输出格式
共 n 行,每行输出一个询问的解。
数据范围
1≤n≤10000,
1≤b≤a≤105
AC代码:
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N = 100010, mod = 1e9 + 7;
int n;
int fact[N], infact[N];
ll qmi(int a, int k, int p){
ll res = 1;
while(k){
if(k & 1) res =(ll) res * a % p;
k >>= 1;
a = (ll) a * a % p;
}
return res;
}
int main(){
fact[0] = infact[0] = 1;
for(int i = 1; i < N; i ++ )
{
fact[i] = (ll) fact[i - 1] * i % mod;
infact[i] = (ll) infact[i - 1] * qmi(i, mod - 2, mod) % mod;
}
cin >> n;
while(n -- ){
int a, b;
cin >> a >> b;
cout << (ll)fact[a] * infact[a - b] % mod * infact[b] % mod << endl;
}
return 0;
}
上一篇: C - 计算组合数
下一篇: 合并数字公式 C 语言如何计算
推荐阅读
-
Spyder 爬虫 - 数据预处理(II)
-
PHP MySQL 预处理语句
-
第 4 章 使用 pandas 进行数据预处理(实际操作)
-
数据预处理(数据清理、数据规范化精髓) python 和 sklearn 数据规范化实践(附项目源代码)
-
数据采集技术综合项目实践3(网络爬虫+数据预处理+数据可视化)》配有详细的步骤说明,干货满满!
-
2.蛋白质组学样本预处理 (3)
-
[RS] Sentinel-2 Sentinel II L1C 数据预处理教程(Sen2Cor 大气校正、SNAP 重采样、ENVI 波段组合)。
-
Arcgis 预处理和获取 30 米二级分类土地利用数据
-
为什么需要语音预处理
-
C 语言中 ## 和 ## 预处理标记的用法和原理分析