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

BD202402跑步 线性求逆元 素数筛 数学

思路

参考 橙之夏 小码_205886 题解

  • 设整个过程用时t,第i个人跑tit\over iit
  • 每个人在整数倍时回到起点,即t=lcm(1,...,n)=lt=lcm(1,...,n)=lt=lcm(1,...,n)=l
  • 假设i<ji<ji<j,两个人差了ti−tj{t\over i}-{t\over j}itjt圈,也是相遇的次数

快的人相对于慢的人的速度为v1−v2v_1 - v_2v1v2,相对路程为(v1−v2)t(v_1 - v_2)t(v1v2)t
每相遇一次,相对路程增加LLL(1 圈),因此相遇次数为(v1−v2)tL=v1tL−v2tL=a−b\frac{(v_1 - v_2)t}{L} = \frac{v_1 t}{L} - \frac{v_2 t}{L} = a - bL(v1v2)t=Lv1tLv2t=ab

  • 总招呼数∑i=1n∑j=i+1n(li−lj)\sum_{i=1}^n \sum_{j=i+1}^n({l\over i}-{l\over j})i=1nj=i+1n(iljl)
  • 公式化简
    在这里插入图片描述

1i1\over ii1使用线性求逆元

void init(int n){//求线性逆元//递推法inv[1]=1;forr(i,2,n){inv[i]=(M-M/i)*inv[M%i]%M;}//利用阶乘求// fact[0]=1;// forr(i,1,n)fact[i]=1LL*fact[i-1]*i%M;// ifac[n]=qpow(fact[n]);// reforr(i,0,n-1)ifac[i]=1LL*ifac[i+1]*(i+1)%M;// forr(i,1,n)inv[i]=1LL*fact[i-1]*ifac[i]%M;
}

递推法推导

模m意义下,i>1i>1i>1时,设m/i=k......r,k⋅i+r≡0(modm)m/i=k......r,k\cdot i+r\equiv 0(mod\ m)m/i=k......r,ki+r0(mod m)

  • 两边乘i−1r−1,k⋅r−1+i−1≡0(modm)i^{-1}r^{-1},k\cdot r^{-1}+i^{-1}\equiv 0(mod\ m)i1r1,kr1+i10(mod m)
  • 移项i−1≡−k⋅r−1(modm)i−1≡(m−mi)⋅r−1(modm)i^{-1}\equiv -k\cdot r^{-1}(mod\ m) \\i^{-1}\equiv (m-{m\over i}) \cdot r^{-1}(mod\ m)i1kr1(mod m)i1(mim)r1(mod m)

质因子分解求lcm

在这里插入图片描述

//p[]是素数数组
int L=1;
forr(i,0,p.size()-1){//LCM(1,...,n)int c=0,tp=1;while (tp*p[i]<=n)tp*=p[i],c++;L=1LL*L*qpow(p[i],c)%M;
}

代码

const int N=1e7+10,M=998244353;
int fact[N],ifac[N],vis[N],inv[N];
vector<int>p;
//不会就学
int qpow(int x,int p=M-2,int mul=1)
{for (;p;p>>=1,x=1LL*x*x%M) if (p&1) mul=1LL*mul*x%M; return mul;
}
void init(int n){//求线性逆元inv[1]=1;forr(i,2,n){inv[i]=(M-M/i)*inv[M%i]%M;}//利用阶乘求// fact[0]=1;// forr(i,1,n)fact[i]=1LL*fact[i-1]*i%M;// ifac[n]=qpow(fact[n]);// reforr(i,0,n-1)ifac[i]=1LL*ifac[i+1]*(i+1)%M;// forr(i,1,n)inv[i]=1LL*fact[i-1]*ifac[i]%M;
}
void pfind(int n){vis[1]=vis[0]=1;forr(i,2,n){if(!vis[i]){p.push_back(i);}if(!p.empty())for(auto j:p){if(i*j>n)break;vis[i*j]=1;if(i%j==0)break;}}
}
void solve(){int n;cin>>n;init(n);int ans=0;forr(i,1,n){//(n-2i+1)*1/i// ans+=1LL*((n-2*i+1+M)%M)*inv[i]%M;//运算顺序错误 应该先乘再取模(ans+=1LL*inv[i]*(n-2*i+1+M)%M)%=M;}pfind(n);int L=1;forr(i,0,p.size()-1){//LCM(1,...,n)int c=0,tp=1;while (tp*p[i]<=n)tp*=p[i],c++;L=1LL*L*qpow(p[i],c)%M;}cout<<1LL*L*ans%M<<endl;}
http://www.dtcms.com/a/314843.html

相关文章:

  • 数分思维13:AB测试
  • 开源网页生态掘金:从Bootstrap二次开发到行业专属组件库的技术变现
  • 复杂场景识别率↑31%!陌讯多模态融合算法在智慧环卫的实战解析
  • 上一篇文章的补充理解
  • 深度学习零基础入门(4)-卷积神经网络架构
  • sqli-libs通关教程(21-30)
  • 文件上传
  • c++ std::vector std::find_if 自定义结构体 查找
  • 算力网络架构演进的思考
  • Linux 系统启动原理
  • TorchDynamo源码解析:从字节码拦截到性能优化的设计与实践
  • 服务器数据安全:利用阿里云OSS/腾讯云COS实现网站数据自动备份
  • 操作系统中线程的三种实现方式
  • 牛客网之华为机试题:HJ26 字符串排序
  • Webpack 搭建 Vue3 脚手架详细步骤
  • 自动驾驶中的传感器技术22——Camera(13)
  • Java直接内存的介绍和实现
  • FastAPI后端工程化项目记录
  • STM32_Hal库学习SPI
  • MSPM0开发学习笔记:二维云台结合openmv实现小球追踪
  • 反阶持仓筹码副图指标,三红做多持股技术及指标案例
  • 图的存储方式-无向图-邻接多重表
  • 7.1、《软件工程》-软件生命周期-CMM-开发模型
  • 一文速通:命名实体识别(NER)训练方案与标注方法全解析
  • 我用一个 Postgres 实现一整套后端架构!
  • 【SpringAI】SpringAI的介绍与简单使用
  • Vue3核心语法进阶(生命周期)
  • 【笔记】ROS1|2 Turtlebot3汉堡Burger连接和远程控制【旧文转载】
  • P1002 [NOIP 2002 普及组] 过河卒
  • RocksDB 核心入口:DB类源码解析