BZOJ 3782: 上学路 Lucas+ExCRT+容斥+dp

本文介绍了一种利用中国剩余定理解决复杂算法问题的方法,通过具体实例展示了如何在竞赛编程中运用该定理进行高效取模运算。文章深入解析了代码实现细节,包括长整数运算、快速幂计算、Lucas定理应用及扩展中国剩余定理的实现。

比较综合的一道题,需要用到中国剩余定理来进行取模. 

Code:

#include <cstdio> 
#include <algorithm>  
#define N 1000006    
#define ll long long   
#define setIO(s) freopen(s".in","r",stdin) 
using namespace std;    
ll F[N];       
int array[10]={0,3,5,6793,10007};
struct Node {
	ll x,y;  
	Node(ll x=0,ll y=0):x(x),y(y){} 
}arr[N];     
bool cmp(Node a,Node b) {
	return a.x==b.x?a.y<b.y:a.x<b.x; 
}        
ll qpow(ll base,ll k,ll mod) {
	ll tmp=1; 
	for(;k;k>>=1,base=base*base%mod) 
		if(k&1) tmp=tmp*base%mod; 
	return tmp;       
}
struct Lucas { 
	int mod; 
	int fac[N];     
	int inv(int i) { 
		return (int)qpow(i,mod-2,mod); 
	}
	void init(int p) {  
		mod=p,fac[0]=1;   
		for(int i=1;i<=mod;++i) fac[i]=(ll)fac[i-1]*i%mod;    
	} 
    int C(int x,int y) { 
    	if(y>x) return 0; 
    	if(y==0) return 1;    
    	return (int)(1ll*fac[x]*inv(fac[y])%mod*inv(fac[x-y])%mod);      
    }     
    int solve(ll x,ll y) {
    	if(y>x) return 0; 
    	if(y==0) return 1;     
    	return (int)(1ll*solve(x/mod,y/mod)*C(x%mod,y%mod)%mod);   
    }
}comb[8];  
struct excrt { 
	ll arr[N],brr[N];   
	ll exgcd(ll a,ll b,ll &x,ll &y) {
		if(!b) { 
			x=1,y=0; 
			return a; 
		} 
		ll gcd=exgcd(b,a%b,x,y),tmp=x;       
		x=y,y=tmp-a/b*y;      
		return gcd;      
	}    
	ll Excrt() { 
		int i,j; 
		ll ans=arr[1],M=brr[1];        
        for(i=2;i<=4;++i) {
        	ll a=M,b=brr[i],c=arr[i]-ans,gcd,x,y;
        	gcd=exgcd(a,b,x,y),b=abs(b/gcd);            
        	x=(x*(c/gcd)%b+b)%b;           
        	ans+=M*x;   
        	M*=brr[i]/__gcd(brr[i],M);    
        	ans=(ans%M+M)%M; 
        } 
        return ans;    
	}
}crt;            
ll C(ll a,ll b,int ty) {   
	if(ty==0) 
		return comb[0].solve(a,b);   
	else {
		int i,j; 
		for(i=1;i<=4;++i) {                         
			crt.arr[i]=comb[i].solve(a,b); 
			crt.brr[i]=array[i];                     
		}
	} 
	return crt.Excrt();  
}
int main() {
	int i,j,k,flag;   
	// setIO("input"); 
	ll n,m,mod;   
	scanf("%lld%lld%d%lld",&n,&m,&k,&mod),flag=(mod==1019663265);   
	if(!flag) {
		comb[0].init(mod);   
	}
	else { 
		for(i=1;i<=4;++i) 
			comb[i].init(array[i]); 
	}              
	for(i=1;i<=k;++i) 
		scanf("%lld%lld",&arr[i].x,&arr[i].y);           
	arr[++k].x=n,arr[k].y=m;    
	sort(arr+1,arr+1+k,cmp);                                                          
	for(i=1;i<=k;++i) { 
		F[i]=C(arr[i].x+arr[i].y,arr[i].y,flag); 
		for(j=1;j<i;++j) {
			if(arr[j].y<=arr[i].y) 
				F[i]=(F[i]-(F[j]*C(arr[i].x-arr[j].x+arr[i].y-arr[j].y,arr[i].y-arr[j].y,flag)%mod)+mod)%mod;     
		}
	} 
	printf("%lld\n",F[k]);   
	return 0;      
}

  

基于径向基函数神经网络RBFNN的自适应滑模控制学习(Matlab代码实现)内容概要:本文介绍了基于径向基函数神经网络(RBFNN)的自适应滑模控制方法,并提供了相应的Matlab代码实现。该方法结合了RBF神经网络的非线性逼近能力和滑模控制的强鲁棒性,用于解决复杂系统的控制问题,尤其适用于存在不确定性和外部干扰的动态系统。文中详细阐述了控制算法的设计思、RBFNN的结构与权重更新机制、滑模面的构建以及自适应律的推导过程,并通过Matlab仿真验证了所提方法的有效性和稳定性。此外,文档还列举了大量相关的科研方向和技术应用,涵盖智能优化算法、机器学习、电力系统、径规划等多个领域,展示了该技术的广泛应用前景。; 适合人群:具备一定自动控制理论基础和Matlab编程能力的研究生、科研人员及工程技术人员,特别是从事智能控制、非线性系统控制及相关领域的研究人员; 使用场景及目标:①学习和掌握RBF神经网络与滑模控制相结合的自适应控制策略设计方法;②应用于电机控制、机器人轨迹跟踪、电力电子系统等存在模型不确定性或外界扰动的实际控制系统中,提升控制精度与鲁棒性; 阅读建议:建议读者结合提供的Matlab代码进行仿真实践,深入理解算法实现细节,同时可参考文中提及的相关技术方向拓展研究思,注重理论分析与仿真验证相结合。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值