类欧几里得算法
变量
- :。
- :。
- :。
- : 的逆元。
- : 的逆元。
函数
- :初始化。
- :求对应的 。
代码
struct leuler{
struct Node{
ll f,g,h;
}res;
ll n2,n6;
leuler(){n2=qmi(2,mod-2);n6=qmi(6,mod-2);}
Node solve(ll a,ll b,ll c,ll n){
ll ra=a/c%mod,rb=b/c%mod,rn=n%mod;
if(a==0)return (Node){(rn+1)*rb%mod,(rn+1)*rb%mod*rb%mod,(rn+1)*rn%mod*n2%mod*rb%mod};
Node x,y;
if(ra||rb){
y=solve(a%c,b%c,c,n);
x.f=(y.f+(rn+1)*rn%mod*n2%mod*ra%mod+(rn+1)*rb%mod)%mod;
x.g=(2*rb%mod*y.f%mod+y.g+2*ra%mod*y.h%mod
+rn*(rn+1)%mod*(2*rn%mod+1)%mod*n6%mod*ra%mod*ra%mod
+rn*(rn+1)%mod*ra%mod*rb%mod+(rn+1)*rb%mod*rb%mod)%mod;
x.h=(y.h+rn*(rn+1)%mod*(2*rn%mod+1)%mod*n6%mod*ra%mod+(rn+1)*rn%mod*n2%mod*rb%mod)%mod;
return x;
}
ll m=(a*n+b)/c,rm=m%mod;
y=solve(c,c-b-1,a,m-1);
x.f=(-y.f+rn*rm%mod+mod)%mod;
x.g=(-x.f-2*y.f%mod-2*y.h%mod+rn*rm%mod*(rm+1)%mod+3*mod)%mod;
x.h=(-y.f-y.g+rm*rn%mod*(rn+1)%mod+2*mod)%mod*n2%mod;
return x;
}
}eu;
本文作者:luckydrawbox
本文链接:https://www.cnblogs.com/luckydrawbox/p/18526436
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步