2021牛客多校第八场A

本文探讨了在面临n个待解决问题中,通过增强部分简单问题的数据并利用有限次代码段获取机会,如何最大化解决a个不变问题的概率。涉及概率计算、分数取模和费马小定理,最终目标是求解在给定条件下的问题解决数,结果对4933取模。
摘要由CSDN通过智能技术生成

题意:有n个问题要解决,n-m个问题被改变,增强了剩下m个问题到最简单的a个问题的数据,现在这个人可以解决那a个最简单的没有改变的问题,有k次机会获得代码段,所有需要的代码段长度为l,每次获得代码段的机会给x,y,z三个数字,代表不能获得x行代码的概率为y/z(保证xi求和=l)

求这个人能解决多少道题(结果要mod4933)

思路:

给的变量很多,有用的就k,a,y,z;(当时就是因为不懂那么多变量,还有那个分数取模,唉)

这个人能解决的题目数量就是a+(1-y1/z1)*(1-y2/z2)...*(1-yk/zk);

因为后面的是一个概率,涉及一个知识:

对于a/b这个分数取p模=a*对1/b取p模

对对1/b取p模=逆元x,其中bx=1(mod p)

由费马小定理b^(p-1)=1(mod p)   当b和p互质

(费马小定理还要用到快速幂)

所以x=b^(p-2)(mod p)

因此只需要求出每一个分数的逆元x相乘再加上a,最后mod p输出就行

代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int Mod = 4933;

int quick_pow(int base)
{
	int ans = 1;
	int y = Mod - 2;
	while (y)
	{
		if (y & 1)
		{
			ans =(ans*base)%Mod;
		}
		base = (base * base) % Mod;
		y >>= 1;
	}
	return ans % Mod;
}

int main()
{
	int m, n, k, a, l;
	cin >> n >> m >> k >> a >> l;
	int ans = 1;
	while (k--)
	{
		int x, y, z;
		cin >> x >> y >> z;
		//p/q(mod m)等价于p*x(x是1/q的逆元)
		if (x)//x还可能为0呢,这个坑。。啧
		{
			ans = ans * (z - y) % Mod * quick_pow(z) % Mod;
		}
		//i/z的逆元=z^(p-2)Mod(p),费马小定理
	}
	cout << (ans + a) % Mod;
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值