当前位置: 首页 > news >正文

【CCF-CSP】 202309-3 梯度求解

思路:

将表达式整理成只有目标求导变量的无括号加法表达式,其他变量均代入其值,然后利用最简单的求导公式,求出最终值。

样例1
x1 x1 x1 * x2 + *转换成 x1*x1*x1+x1*x2
若求导x1,则只留下x1,变为 x1*x1*x1+x1*3
求导完就是 3*x1*x1+3

更一般的,我们可以只记录表达式的系数和指数,那么我们要将每个运算数转换为一元表达式

x1*x1*x1+x1*3转换为
指数1 系数3
指数3 系数1求导之后为
指数0 系数3*1
指数2 系数1*3

对于+运算和-运算,对最终表达式就是直接相加和相减就好了,对*运算,我们要将两个表达式进行乘法运算,指数相加,系数相乘

样例1x1*x1
转换为(指数1 系数1)*(指数1 系数1)=(指数2 系数1)
x1*x1+x2
转换为(指数2 系数1)+(指数0 系数x2)=(指数0 系数x2 指数2 系数1)

代码:

#include <bits/stdc++.h>
#define N 105
using namespace std;
typedef long long ll;
const int mod=1e9+7;int n,m;
ll a[N],k;
string str,s;
vector<string> ve;
stack<map<ll,ll> > st;//记录运算数的一元表达式的系数和指数int main(){cin>>n>>m;getchar();getline(cin,str);stringstream ss(str);while(ss>>s){//所有的运算符和运算数ve.push_back(s);}for(int t=0;t<m;t++){cin>>k;str="x"+to_string(k);//求导变量for(int i=1;i<=n;i++) cin>>a[i];for(int i=0;i<ve.size();i++){s=ve[i];if(s=="+"||s=="-"||s=="*"){//运算符map<ll,ll> mp2=st.top(); st.pop();map<ll,ll> mp1=st.top(); st.pop();map<ll,ll> mp;if(s=="+"){//加法mp=mp1;for(map<ll,ll>::iterator it=mp2.begin();it!=mp2.end();it++){mp[it->first]+=it->second;mp[it->first]%=mod;}}else if(s=="-"){//减法mp=mp1;for(map<ll,ll>::iterator it=mp2.begin();it!=mp2.end();it++){mp[it->first]-=it->second;mp[it->first]%=mod;}}else{//乘法for(map<ll,ll>::iterator it1=mp1.begin();it1!=mp1.end();it1++){for(map<ll,ll>::iterator it2=mp2.begin();it2!=mp2.end();it2++){mp[it1->first+it2->first]+=it1->second*it2->second;mp[it1->first+it2->first]%=mod;}}}mp1.clear(); mp2.clear();st.push(mp);}else if(s==str){//是求导变量,保留map<ll,ll> mp;mp[1]=1;st.push(mp);}else if(s[0]=='x'){//是其他变量,则代入其值int d=stod(s.substr(1));map<ll,ll> mp;mp[0]=a[d]%mod;st.push(mp);}else{//是数字ll d=stol(s);map<ll,ll> mp;mp[0]=d%mod;st.push(mp);}}map<ll,ll> mp=st.top(); st.pop();//获得结果的一元表达式ll ans=0,fac=1,pree=0;for(map<ll,ll>::iterator it=mp.begin();it!=mp.end();it++){ll e=it->first,c=it->second;for(int i=pree+1;i<e;i++) fac=fac*a[k]%mod; pree=e==0?0:e-1;ans=(ans+c*e*fac)%mod;//简单求导公式}cout<<(ans+mod)%mod<<endl;mp.clear();}return 0;
}

http://www.lryc.cn/news/353349.html

相关文章:

  • jvm的类加载
  • 2024年汉字小达人活动4个多月开赛:18道历年选择题和答案、解析
  • 群晖安装青龙脚本
  • 【机器学习系列】使用高斯贝叶斯模型进行数据分类的完整流程
  • Python中的单例模式:原理、实现与应用
  • Linux基础(六):Linux 系统上 C 程序的编译与调试
  • 移动硬盘难题:不显示容量与无法访问的解决策略
  • 基于springboot+vue的智慧外贸平台
  • @Async详解,为什么生产环境不推荐直接使用@Async?
  • LaTeX 2022软件安装教程(附软件下载地址)
  • 纯干货分享 机器学习7大方面,30个硬核数据集
  • 算法训练营day46
  • 推荐五个线上兼职,在家也能轻松日入百元,适合上班族和全职宝妈
  • Python_文件操作_学习
  • Leetcode 3154. Find Number of Ways to Reach the K-th Stair
  • Vue3/Vite引入EasyPlayer.js播放H265视频错误的问题
  • CentOS 7安装alertmanager
  • YOLOv10详细解读 | 一文带你深入了解yolov10的创新点(附网络结构图 + 举例说明)
  • 【openlayers系统学习】3.5colormap详解(颜色映射)
  • Redis教程(十五):Redis的哨兵模式搭建
  • 【C语言】8.C语言操作符详解(3)
  • 离线初始化k8s
  • C++字符编码 cppp-reiconv库使用详解
  • 通过继承React.Component创建React组件-5
  • PgSQL内核机制 - 算子执行统计元组个数
  • Ubuntu/Linux 安装Paraview
  • 内存泄漏及其解决方法
  • Java进阶学习笔记13——抽象类
  • 【Docker学习】深入研究命令docker exec
  • C语言中的文件操作