快速幂——Jxc军训
题目描述
Jxc将天空看做一个 n * n 的矩阵,此时天上有 m 朵云,这些云会随机分布在 m 个不同的位置,同时太阳会随机出现在一个位置,Jxc 想知道他被太阳晒到的概率是多少,由于他仍在站军姿,所以这个有趣的问题就交给了你。考虑到精度问题,Jxc 只需要知道这个概率在对 998244353 取模意义下的值。
Tips:一个分数 p / q 在模意义下的值即 p * q - 1 在模意义下的值,Xp-1 ≡ 1 (mod p)
输入描述
输入只有一行,包含两个整数n、m。n和m的意义见题面。
输出描述
第一行包含一个整数Ans,为答案
示例
输入
2 2
输出
499122177
备注
1 <= n, m <= 2000,m <= n^2
分析
根据题意,我们可以得到概率为 (n * n - m) / (n * n)
设 (n * n - m) / (n * n) ≡ s % p (p 为质数)
则有 (n * n - m) ≡ s * (n * n) % p
设 x 为 (n * n) 的逆元,即 (n * n) * x =1
则有 (n * n - m) * x ≡ s % p
而根据费马小定理,x = (n * n)p-2
因此,我们只要通过快速幂计算 (n * n -m) * (n * n)p-2 % p 即可得到答案
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=998244353;
ll quickpow(ll b,ll p)
{
ll result=1;
while(p){
if(p&1){
result=result*b%mod;
}
p>>=1;
b=b*b%mod;
}
return result;
}
int main()
{
ll n,m;
cin>>n>>m;
ll ans=(n*n-m)%mod*quickpow(n*n,mod-2)%mod;
cout<<ans<<endl;
return 0;
}