【bzoj3782】上学路线 组合数学+Lucas定理+中国剩余定理

不考虑障碍
从(0,0)走到(n,m)的方案数为C(n,n+m)
先把障碍按照横坐标第一关键字,纵坐标第二关键字排序
f[i]表示不经过前i-1个障碍经过第i个障碍的方案数
f[i]=C(a[i].x,a[i].x+a[j].x)-∑f[j]*C(a[i].x-a[j].x,a[i].x-a[j].x+a[i].x-a[j].y) (a[j].x<=a[i].x,a[j].y<=a[i].y)

把(N,M)当成障碍加进去,最后输出f[T+1]就可以了


#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<iostream>

using namespace std;

struct yts
{
	long long x,y;
}a[1010];

long long n,m,P;
long long p[10];
long long fac[5][1000010],inv[5][1000010];
long long f[1010];
long long g[10],sum[10],Inv[10];
int num;
bool w=0;

bool cmp(yts x,yts y)
{
	return x.x<y.x || (x.x==y.x && x.y<y.y);
}

long long power(long long x,long long y,long long p)
{
	long long ans=1;
	while (y)
	{
		if (y&1) ans=ans*x%p;
		x=x*x%p;
		y>>=1;
	}
	return ans;
}

long long c(long long x,long long y,int i)
{
	if (x<p[i] && y<p[i]) return (fac[i][y]*inv[i][x]%p[i])*inv[i][y-x]%p[i];
	else return c(x%p[i],y%p[i],i)*c(x/p[i],y/p[i],i)%p[i];
}

long long C(long long x,long long y)
{
	if (!w) return c(x,y,0);
	else
	{
		for (int i=1;i<=4;i++) g[i]=c(x,y,i);
		long long ans=0;
		for (int i=1;i<=4;i++) ans=(ans+(g[i]*sum[i]%P)*Inv[i]%P)%P;
		return ans;
	}
}

int main()
{
	scanf("%lld%lld%d%lld",&n,&m,&num,&P);
	for (int i=1;i<=num;i++) scanf("%lld%lld",&a[i].x,&a[i].y);
	a[++num].x=n;a[num].y=m;
	sort(a+1,a+num+1,cmp);
	if (P!=1000003) p[1]=3,p[2]=5,p[3]=6793,p[4]=10007,w=1; else p[0]=1000003;
	if (w)
	{
		for (int j=1;j<=4;j++)
		{
			fac[j][0]=1;sum[j]=P/p[j];Inv[j]=power(sum[j],p[j]-2,p[j]);
			for (int i=1;i<p[j];i++) fac[j][i]=(long long)fac[j][i-1]*i%p[j];
			inv[j][p[j]-1]=power(fac[j][p[j]-1],p[j]-2,p[j]);
			for (int i=p[j]-2;i>=0;i--) inv[j][i]=(long long)inv[j][i+1]*(i+1)%p[j];
		}
	}
	else 
	{
		fac[0][0]=1;
		for (int i=1;i<P;i++) fac[0][i]=(long long)fac[0][i-1]*i%P;
		inv[0][P-1]=power(fac[0][P-1],P-2,P);
		for (int i=P-2;i>=0;i--) inv[0][i]=(long long)inv[0][i+1]*(i+1)%P;
	}
	for (int i=1;i<=num;i++)
	{
		f[i]=C(a[i].x,a[i].x+a[i].y);
		for (int j=1;j<i;j++)
		  if (a[j].x<=a[i].x && a[j].y<=a[i].y) f[i]=(f[i]-f[j]*C(a[i].x-a[j].x,a[i].x-a[j].x+a[i].y-a[j].y)%P+P)%P;
	}
	printf("%lld\n",f[num]);
	return 0;	
}


智能网联汽车的安全员高级考试涉及多个方面的专业知识,包括但不限于自动驾驶技术原理、车辆传感器融合、网络安全防护以及法律法规等内容。以下是针对该主题的些核心知识点解析: ### 关于智能网联车安全员高级考试的核心内容 #### 1. 自动驾驶分级标准 国际自动机工程师学会(SAE International)定义了六个级别的自动驾驶等级,从L0到L5[^1]。其中,L3及以上级别需要安全员具备更高的应急处理能力。 #### 2. 车辆感知系统的组成与功能 智能网联车通常配备多种传感器,如激光雷达、毫米波雷达、摄像头和超声波传感器等。这些设备协同工作以实现环境感知、障碍物检测等功能[^2]。 #### 3. 数据通信与网络安全 智能网联车依赖V2X(Vehicle-to-Everything)技术进行数据交换,在此过程中需防范潜在的网络攻击风险,例如中间人攻击或恶意软件入侵[^3]。 #### 4. 法律法规要求 不同国家和地区对于无人驾驶测试及运营有着严格的规定,考生应熟悉当地交通法典中有关自动化驾驶部分的具体条款[^4]。 ```python # 示例代码:模拟简单决策逻辑 def decide_action(sensor_data): if sensor_data['obstacle'] and not sensor_data['emergency']: return 'slow_down' elif sensor_data['pedestrian_crossing']: return 'stop_and_yield' else: return 'continue_driving' example_input = {'obstacle': True, 'emergency': False, 'pedestrian_crossing': False} action = decide_action(example_input) print(f"Action to take: {action}") ``` 需要注意的是,“橙点同学”作为特定平台上的学习资源名称,并不提供官方认证的标准答案集;建议通过正规渠道获取教材并参加培训课程来准备此类资格认证考试。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值