2024年码蹄杯省赛本科组C题 移动移动移动 题型:数论->概率论,快速幂,逆元

210 阅读1分钟

码题集OJ-移动移动移动 (matiji.net)

题意解析

小码从x1y1这个点开始走,朝右边走的概率是/fracp100/frac{p}{100},超下走的概率是/fracq100/frac{q}{100},问经过n秒之后到达x2y2点的概率是多少? image.png

思想

nn次实验,发生kk次.其中每一次要么发生要么不发生,发生的概率就是pp,不发生的概率就是1p1-p image.png

一共发生了多少次我们用: Cnk.pk.(1p)nkCn^{k} . p^{k} . (1-p)^{n-k}

1.CnkCn^{k}=n!k!.(nk)!\frac{n!}{k!.(n-k)!},分母我们要将其转化为逆元.

2.pkp^{k}我们用快速幂去算

code

注意提交的时候需要把y1替换为ya

#define int long long

const int mod=998244353;
const int N=3e5+10;
int x1,x2,y1,y2,n,p,q;
int fac[N];
int qmi(int a,int b,int m)
{
	a%=m;
	int res=1;
	while(b)
	{
		if(b&1) res=res*a%m;
		a=a*a%m;
		b>>=1;
	}
return res;
}
int C(int a,int b)
{
	int n=fac[a];
	int m=fac[b]*fac[a-b]%mod;
	
	return n*qmi(m,mod-2,mod)%mod;
}

signed main()
{
  //预处理一下阶乘,方便后面计算cnk
  fac[0]=1;
  for(int i=1;i<N;i++)fac[i]=fac[i-1]*i%mod; 
  int t;std::cin>>t;
  while(t--)
  {
    scanf("%d%d%d%d%d%d%d",&x1,&y1,&x2,&y2,&n,&p,&q);
	int dx=x2-x1,dy=y2-y1;
	if(dx<0 || dy<0 ||dx+dy!=n)
	{
		std::cout<<0<<std::endl;
	    continue;
	}
    p=p*qmi(100,mod-2,mod)%mod;
	q=q*qmi(100,mod-2,mod)%mod;
	int ans=
	        C(n,dx)*qmi(p,dx,mod)%mod*qmi(q,dy,mod)%mod;
    std::cout<<ans<<std::endl;
  }
return 0;	
} 

image.png