IT虾米网

AcWing 230. 排列计数 错排问题

bjzhanghao 2022年11月07日 编程语言 32 0

代码如下:

#include <bits/stdc++.h> 
// #define LOCAL 
#define INF 0x3f3f3f3f3f3f3f3f 
#define IOS ios::sync_with_stdio(false), cin.tie(0) 
#define int long long 
#define debug(a) cerr << #a << "=" << a << endl; 
using namespace std; 
const int mod = 1e9 + 7, N = 1e6; 
int f[N + 2], fac[N + 2], inv[N + 2]; 
int qmi(int a, int k, int p){ 
    int ans = 1; 
    while(k){ 
        if(k & 1) 
            ans = ans * a % p; 
        k >>= 1; 
        a = a * a % p; 
    } 
    return ans; 
} 
void solve(){ 
    int n, m; 
    scanf("%lld%lld", &n, &m); 
    cout << fac[n] * inv[n - m] % mod * inv[m] % mod * f[n - m] % mod << ' 
'; 
} 
 
void init(){ 
 
    f[0] = f[2] = fac[0] = fac[1] = inv[0] = inv[1] = 1; //注意,元素个数为0时,是错排的 
    fac[2] = 2, inv[2] = qmi(2, mod - 2, mod); 
    for (int i = 3; i <= N; ++i){ 
        f[i] = (f[i - 1] + f[i - 2]) % mod * (i - 1) % mod; 
        fac[i] = fac[i - 1] * i % mod; 
        inv[i] = qmi(fac[i], mod - 2, mod); 
    } 
} 
signed main(){ 
#ifdef LOCAL 
    freopen("input.in", "r", stdin); 
    freopen("output.out", "w", stdout); 
#endif 
    // IOS; 
    init(); 
    int tt; 
    scanf("%lld", &tt); 
    while(tt--) 
        solve(); 
} 

总结

写到这里也结束了,在文章最后放上一个小小的福利,以下为小编自己在学习过程中整理出的一个关于 java开发 的学习思路及方向。从事互联网开发,最主要的是要学好技术,而学习技术是一条慢长而艰苦的道路,不能靠一时激情,也不是熬几天几夜就能学好的,必须养成平时努力学习的习惯,更加需要准确的学习方向达到有效的学习效果。

由于内容较多就只放上一个大概的大纲,需要更及详细的学习思维导图的 点击我的Gitee获取
还有 高级java全套视频教程 java进阶架构师 视频+资料+代码+面试题!

全方面的java进阶实践技术资料,并且还有技术大牛一起讨论交流解决问题。


本文参考链接:https://blog.csdn.net/m0_67391870/article/details/123499563
评论关闭
IT虾米网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!

Java多线程中Lock锁如何使用