Wannafly挑战赛13 B-Jxc军训
链接:https://www.nowcoder.com/acm/contest/80/B
来源:牛客网
题目描述
在文某路学车中学高一新生军训中,Jxc正站在太阳下站着军姿,对于这样的酷热的阳光,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,为答案
示例1
输入
2 2
输出
499122177
备注:
1 <= n, m <= 2000,m <=n^2
思路
首先,注意!!!
‘≡’ 的意思是同余而不是恒等!!!!(捂脸~):
两个整数a,b,若它们除以整数m所得的余数相等,则称a,b对于模m同余。
记作:a ≡ b(mod m)
读作:a同余于b模m(或读作a与b关于模m同余)。
比如:26 ≡ 14(mod 12)。
然后本题要求的概率是:
ans=n∗n−mn∗n=(n∗n−m)∗(n∗n)−1
题中Tips中给了费马小定理:
Xp−1≡1(mod p)
则 X−1≡Xp−2(mod p) , X−1 与 Xp−2 同余,所以求 Xp−2mod p 即可。
AC代码
#include<iostream>
using namespace std;
const int Mod = 998244353;
typedef long long ll;
// 快速幂 a ^ b % c
ll QuickMod(ll a,ll b,ll c) {
ll ans = 1;
while(b) {
if(b&1)
ans = ans*a%c;
b >>= 1;
a = a*a%c;
}
return ans;
}
int main()
{
ll n,m;
cin >> n >> m;
ll ans=n*n-m;
ans=(ans*QuickMod(n*n,Mod-2,Mod))%Mod;
cout << ans << endl;
return 0;
}