ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Robot Cleaner Revisit(CF)

2022-01-08 18:00:07  阅读:177  来源: 互联网

标签:Cleaner return int d% Robot CF rb mul mod


Codeforces Round #763 (Div. 2)

D. Robot Cleaner Revisit

题目链接:https://codeforces.com/contest/1623/problem/D
解题代码来自于cf某大佬 :By AlanSkarica;

思路:

由于最多只有n ∗ * ∗m个点,所以循环的点最多n ∗ * ∗m个,又因为边缘只有两种状态,顶点只有一种状态,故共有4(m-1)(n-1)种状态点,且4(m-1)(n-1)一定是环的边长的整数倍,对于每k种状态x1,x2…xk,每个状态可能的情况都是 p / 100 p/100 p/100,对于x1,若在x1点清扫 则需0s,若不在则需 x x x2 + 1 + 1 +1 s,以此类推若此点可清楚xk = (1-p/100)(1 + x1),不能清楚则xk = (1 + x1);
最终便可得到方程:
x=a1(1+a2(1+a3(1+…ak(1+x)…)))
ai表示第i个点可以消除。
同时该式可改写成 x = u + vx 的形式,最后所求 x = u/(1-v);

这里由于mod为质数,故可用费马小定理来求解 x⋅(1-v)≡u,最终 x = u*(1-v)^{mod - 2}^

代码:

#include<iostream>

using namespace std;
const int mod = 1e9 + 7;
typedef long long ll;

int add(int x,int y){
	x += y;
	while(x >= mod) x -= mod;
	while(x < 0) x += mod;
	return x;
}

int mul(int x,int y){
	return ( x * 1ll* y) % mod;
}

int binpow(int x,int y){
	int c = 1;
	while(y){
		if(y % 2 == 1) c = mul(c,x);
		x = mul(x,x);
		y /= 2;
	}
	return c;
}

int inv(int x){
	return binpow(x,mod - 2);
}

int divide(int x,int y){
	return mul(x,inv(y));
}

void solve()
{
	int n,m,rb,cb,rd,cd,p;
	scanf("%d%d%d%d%d%d%d",&n,&m,&rb,&cb,&rd,&cd,&p);
	p = add(1,-divide(p,100));
	
	int u = 0 , v = 1 , dr = -1 , dc = -1;
	
	for(int i = 0 ; i < 4 * ( m - 1) * (n - 1) ; i++){
		if(rb + dr < 1 || rb + dr > n) dr *= -1;
		if(cb + dc < 1 || cb + dc > m) dc *= -1;
		rb += dr;
		cb += dc;
		
		u = add(u,1);
		if(rb == rd || cb == cd){
			u = mul(u,p);
			v = mul(v,p);
		} 
	}
	cout<<divide(u,add(1,-v))<<"\n";
}
int main()
{
	
	int tt;
	scanf("%d",&tt);
	while(tt--){
		solve();
	}
	return 0;
 } 

标签:Cleaner,return,int,d%,Robot,CF,rb,mul,mod
来源: https://blog.csdn.net/qq_52060151/article/details/122383480

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有