万能欧几里得

万能欧几里得

感谢可爱 cftm

y=ax+bcx(0,n] 中,如果遇到一条 x=k 的竖线执行 R,否则执行 U,如果遇到整点先 UR(可以将 U,R 视作具有结合律的信息),问最后得到的信息是啥。

记作 solve(n,a,b,c,U,R),其中 0b<c

如果 ac:此时 x 每增大 1 必然碰到 abU,同时分子累加 amodc,所以转移到 solve(n,amodc,b,c,U,UacR)

如果 a<c:记 si 为第 iR 前面有多少个 U,那么 si=ax+bc,反过来考虑一个 U 前面有多少个 R,那么就有:

ax+bc<yax+b<cyx<cybaxcyb1a

所以可以转一下看成 y=cxb1a 这条直线,然后交换 U,R。现在有三个问题:

  • 新的定义域是啥;
  • 最后一个 U 后面的 R 没统计上它们有多少个;
  • b1 是负数。

挨个解决(这里的 U,R 都是原问题的,也就是交换前的):

  • 在原问题中一共有 m=an+bcU 所以新问题的定义域可以视作 (0,m]
  • 那么一共统计到了 cmb1aR,所以最后需要额外补上 ncmb1aR
  • 考虑将第一个 U 前面的 R 单独算,在前面补上 cb1aR 和一个 U。本来分子的积累是 b1,补完 U 以后分子的积累变成了 cb1,因为这个实际意义是分子每积累到一个 a 的倍数就多一个 R,所以要将状态改为 y=cx+((cb1)moda)a,需要的 U 少了个一个于是定义域改为 (0,m1]

板子题的代码,可能慢了一点,唉

ele qpow(ele x,ll y){
	ele s=I;
	while(y){
		if(y&1)s=s*x;
		x=x*x;
		y>>=1; 
	}
	return s;
}
ele solve(ll n,ll a,ll b,ll c,ele U,ele R){
	if(n<=0)return I;
	if(a>=c)return solve(n,a%c,b,c,U,qpow(U,a/c)*R);
	ll m=((i128)a*n+b)/c;
	if(!m)return qpow(R,n);
	return qpow(R,(c-b-1)/a)*U*solve(m-1,c,(c-b-1)%a,a,R,U)*qpow(R,n-(c*m-b-1)/a);
}
posted @   do_while_true  阅读(58)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
历史上的今天:
2022-11-13 DFA题
2021-11-13 「题解」Codeforces 1605 D Treelabeling

This blog has running: 1845 days 1 hours 33 minutes 19 seconds

点击右上角即可分享
微信分享提示