为了能到远方,脚下的每一步都不能少.|

luckydrawbox

园龄:4个月粉丝:1关注:2

类欧几里得算法

变量

  • Node::f\texttt{Node::f}i=0nai+bc\sum\limits_{i=0}^{n}\lfloor \frac{ai+b}{c} \rfloor
  • Node::g\texttt{Node::g}i=0nai+bc2\sum\limits_{i=0}^{n}{\lfloor \frac{ai+b}{c} \rfloor}^2
  • Node::h\texttt{Node::h}i=0niai+bc\sum\limits_{i=0}^{n}i\lfloor \frac{ai+b}{c} \rfloor
  • ll n2\texttt{ll n2}22 的逆元。
  • ll n6\texttt{ll n6}66 的逆元。

函数

  • leuler()\texttt{leuler()}:初始化。
  • Node solve(ll a,ll b,ll c,ll n)\texttt{Node solve(ll a,ll b,ll c,ll n)}:求对应的 f,g,hf,g,h

代码

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 中国大陆许可协议进行许可。

posted @   luckydrawbox  阅读(2)  评论(0编辑  收藏  举报  
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起