快速幂——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,为答案

示例

输入

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;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值