首页 > 其他分享 >万能欧几里得

万能欧几里得

时间:2023-11-13 21:24:14浏览次数:28  
标签:lfloor qpow ll frac 欧几里得 rfloor ele 万能

感谢可爱 cftm

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

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

如果 \(a\geq c\):此时 \(x\) 每增大 \(1\) 必然碰到 \(\lfloor\frac{a}{b}\rfloor\) 个 \(U\),同时分子累加 \(a\bmod c\),所以转移到 \(solve(n,a\bmod c,b,c,U,U^{\lfloor\frac{a}{c}\rfloor}R)\)。

如果 \(a<c\):记 \(s_i\) 为第 \(i\) 个 \(R\) 前面有多少个 \(U\),那么 \(s_i=\lfloor\frac{ax+b}{c}\rfloor\),反过来考虑一个 \(U\) 前面有多少个 \(R\),那么就有:

\[\lfloor\frac{ax+b}{c}\rfloor<y \\ ax+b<cy \\ x<\frac{cy-b}{a} \\ x\leq \left\lfloor\frac{cy-b-1}{a}\right\rfloor \]

所以可以转一下看成 \(y=\frac{cx-b-1}{a}\) 这条直线,然后交换 \(U,R\)。现在有三个问题:

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

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

  • 在原问题中一共有 \(m=\lfloor\frac{an+b}{c}\rfloor\) 个 \(U\) 所以新问题的定义域可以视作 \((0,m]\)。
  • 那么一共统计到了 \(\left\lfloor\frac{cm-b-1}{a}\right\rfloor\) 个 \(R\),所以最后需要额外补上 \(n-\left\lfloor\frac{cm-b-1}{a}\right\rfloor\) 个 \(R\)。
  • 考虑将第一个 \(U\) 前面的 \(R\) 单独算,在前面补上 \(\lfloor\frac{c-b-1}{a}\rfloor\) 个 \(R\) 和一个 \(U\)。本来分子的积累是 \(-b-1\),补完 \(U\) 以后分子的积累变成了 \(c-b-1\),因为这个实际意义是分子每积累到一个 \(a\) 的倍数就多一个 \(R\),所以要将状态改为 \(y=\frac{cx+((c-b-1)\bmod a)}{a}\),需要的 \(U\) 少了个一个于是定义域改为 \((0,m-1]\)。

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

ele qpow(ele x,int y){
	ele s;s.mem();
	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);
}

标签:lfloor,qpow,ll,frac,欧几里得,rfloor,ele,万能
From: https://www.cnblogs.com/do-while-true/p/17830215.html

相关文章

  • MySQL 人脸向量,欧几里得距离相似查询
    前言    如标题,就是通过提取的人脸特征向量,写一个欧几里得SQL语句,查询数据库里相似度排前TOP_K个的数据记录。做法虽然另类,业务层市面上有现成的面部检索API,技术层现在有向量数据库。        用MySQL关系型存储128维人脸向量,先是进行欧式距离计算就要......
  • 3.3 万能Map
     <insertid="addUser",parameterType="map"> insertintomybatis.user(id,pwd)values(#{userId},#{passWord});</insert>//MapintaddUser2(Map<String,object>map);@TestpublicvoidaddUser2(){  Sqlsessionsqlsession=......
  • 欧几里得算法
    目录1.欧几里得算法说明2.欧几里得算法伪代码3.测试伪代码1.欧几里得算法说明欧几里德(Euclidean)算法的基本原理就是:两个数的最大公约数等于它们中较小的数和两数之差的最大公约数。因此我们可以不断地将这两个数相减,用新两个数(前面的较小值与差值)替代初值求最大公约数。因此......
  • 用欧几里得算法求两个数的最大公约数
    一.什么是欧几里得算法1.欧几里得算法就是辗转相除法,用于求两个数的最大公约数。如果用gcd(a,b)表示a和b的最大公约数,gcd(a,b)=gcd(b,a%b),当a%b==0时,b就是最大公约数。2.算法说明:首先按照大小输入两个整数a、b,再用一个中间量用来存放二者的余数。计算后将b的值赋给a,将余数赋给b......
  • 同余方程(扩展欧几里得)(C/C++)
    ax%b=1,则a和b的最大公约数一定是1。#include<cstdio>#include<iostream>usingnamespacestd;inta,q;intx,y;voidexgcd(inta,intb){ if(b==0) { x=1; y=0; return;//得到gcd(b,0)时到达边界值 }// else { exgcd(b,a%b); intk=x; x=y; y=k-......
  • 对于扩展欧几里得算法的小总结
    对于不定方程\(ax+by=c\)有正数解的充分必要条件是\(c|gcd(a,b)\),证明请看裴蜀定理那么显然的,我们只要能解出方程\(ax+by=gcd(a,b)\)然后把解\(\times\frac{c}{gcd(a,b)}\)即可如何解这个新的方程呢?我们知道\(gcd(a,b)\),并且它等于\(gcd(b,a%b)\),也就是说,方程\(bx+(a%b)y=gcd......
  • 求两个数的最大公约数的欧几里得算法
    上网查找什么是求两个数的最大公约数的欧几里得算法(辗转相除法),提交算法说明和网上链接。算法说明:1.两个正整数中,用大数除以小数求余2.再用其中的大数除以其中的小数求余,重复步骤直至余数为03.当余数为0时,取当前算式除数为最大公约数链接:欧几里得算法(辗转相除法)求最大公约......
  • 扩展欧几里得算法模板
    扩展欧几里得算法问题:给定两个非零整数$a$和$b$,求一组整数解$(x,y)$,使得$ax+by=gcd(a,b)$成立($gcd(a,b)$是a、b的最大公约数)。设$$\begin{aligned}ax_1+by_1&=gcd(a,b)\bx_2+(a%b)y_2&=gcd(b,a%b)\end{aligned}$$化简,得递推公式:$$\begin{aligned}&x_1=y_2\&y......
  • 欧几里得算法
    #include<bits/stdc++.h>usingnamespacestd;intgcd(inta,intb){//欧几里得算法 if(b==0) returna; returngcd(b,a%b);}intexgcd(inta,intb,int&x,int&y){//扩展欧几里得 if(b==0){ x=1; y=0; returna; } intd=exgcd(b,a%b,x,y); intt=x;......
  • 欧几里得算法
    算法说明:用较大数除以较小数,再用出现的余数去除除数,如此反复,直到最后余数是0为止网页链接:https://cn.bing.com/search?q=什么是求两个数的最大公约数的欧几里得算法(辗转相除法)&qs=n&form=QBRE&sp=-1&lq=0&pq=什么是求两个数的最大公约数的欧几里得算法(辗转相除法)&sc=3-27&sk=&cvi......