题目链接:http://118.190.20.162/view.page?gpid=T173

大意是给出逆波兰表达式,给出每个x的值求对某x的偏导。

整理了一些模板,参考 https://blog.csdn.net/qq_62571980/article/details/133958027  码风真好orz

显是多项式的模板,重点是item和formula的表示


struct item{
	ll changshu;
	map<int,int> mp;// x2^5 , mp[2]=5
	// item(ll coe,map<int,int>mp):coefficient(coe),mp(mp) {}//结构体构造函数
};
struct formula{
	vector<item> ve;//多个乘项的链接
};
item item_mul(item a,item b){
	//对常数计算,将b中有a的部分合并到a,剩余添加到a
	ll csc = a.changshu*b.changshu;
	map<int,int> mpc;
	for(auto it=a.mp.begin();it!=a.mp.end();it++){
		mpc[it->first] = a.mp[it->first]+b.mp[it->first];
		b.mp.erase(it->first);
	}
	for(auto it=b.mp.begin();it!=b.mp.end();it++){
		mpc[it->first] = b.mp[it->first];
	}
	item titem;titem.mp = mpc,titem.changshu = csc;
	return titem;
}
formula formula_mul(formula a,formula b){
	//形如f(x)+f(x)+f(x) *  f(x)+f(x)+f(x)
	vector<item>ve;
	for(int i=0;i<a.ve.size();i++){
		for(int j=0;j<b.ve.size();j++){
			ve.push_back(item_mul(a.ve[i],b.ve[j]));
		}
	}
	formula kk; kk.ve = ve;
	return kk;
}
formula formula_add(formula a,formula b){
	//相加用链接的方式
	for(int i=0;i<b.ve.size();i++){
		a.ve.push_back(b.ve[i]);
	}
	return a;
}
formula formula_sub(formula a,formula b){
	for(int i=0;i<a.ve.size();i++){
		a.ve[i].changshu*=-1;
	}
	return formula_add(b,a);
}


然后是求导函数,求导部分。编写代码注意求导直接为0的部分。另一个点就是其余项直接代数计算更加方便。


ll run(formula a,int aim){ //求导函数
	//找到每一项,存在目标进行求导并添加,否则就不用操作0。
	ll sum = 0,mul;
	for(int i=0;i<a.ve.size();i++){
		item cur = a.ve[i];
		mul  = 1;
		if(cur.mp.find(aim)!=cur.mp.end()){
			mul = (cur.changshu*cur.mp[aim])%mod;
			cur.mp[aim]--;
			for(auto it = cur.mp.begin();it!=cur.mp.end();it++){//其余项直接代数
				for(int k=0;k<it->second;k++){
					mul = (mul*val[it->first])%mod;
				}
			}
			sum = (sum+mul)%mod;
		}
	}
	return sum;
}


逆波兰式部分,顺清思路,有了多项式操作的函数比较容易处理。


for(int i=0;i<=s.size();i++){
		if(i==s.size()||s[i]==' '){
			if(temp=="+" || temp=="-" || temp=="*"){
				formula a = st.top(); st.pop();
				formula b = st.top(); st.pop();
				if(temp=="*"){
					st.push(formula_mul(b,a));
				}else if(temp=="+"){
					st.push(formula_add(b,a));
				}else{
					st.push(formula_sub(a,b));
				}
			}else{
				map<int,int> mp;
				vector<item> ve;
				if(temp[0]=='x'){
					int num = to_number(temp.substr(1,temp.size()-1));
					mp[num] = 1;
					item titem;titem.changshu = 1,titem.mp = mp;
					ve.push_back(titem);
				}else{
					int num = to_number(temp);
					item titem;titem.mp = mp,titem.changshu = num;
					ve.push_back(titem);
				}
				formula kk;kk.ve = ve;
				st.push(kk);
			}
			temp = "";
		}else{
			temp+=s[i];
		}
	}