UVA 11768 - Lattice Point or Not

首先本题需要用到扩展欧几里得算法……


关于exgcd算法的一点简略证明:



那么,对于函数exgcd(a,b)=(d,x,y),其中d满足d=gcd(a,b); (x,y)满足ax+by=d;

则exgcd(b,a mod b)=(d,x',y'),而此时,使用 x = y' ;  y = x' - floor(a/b) * y' = x' - floor(a/b) * x 就能得到exgcd(a,b)的值。

故我们可以有扩展欧几里得算法如下:

void exgcd(int a,int b,int &d,int &x,int &y){  
	if(!b){d=a;x=1;y=0;}
	else {exgcd(b,a%b,d,y,x);y-=(a/b)*x;}
}
此处的边界条件是exgcd(a,0)=(a,1,0)


那么此时,若c mod gcd(a,b) = 0,就容易求得一个整点(x,y),那么如何得到所有的点?



然后是题目的代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
typedef long long ll;
using namespace std;
void exgcd(ll a,ll b,ll &d,ll &x,ll &y){  
	if(!b){d=a;x=1;y=0;}  
	else {exgcd(b,a%b,d,y,x);y-=(a/b)*x;}
}
int main() {
	double X1,Y1,X2,Y2;
	int t;
	scanf("%d",&t);
	while(t--){
		scanf("%lf%lf%lf%lf",&X1,&Y1,&X2,&Y2);//获得初始坐标(x1,y1),(x2,y2)
		ll x1=X1*10,x2=X2*10,y1=Y1*10,y2=Y2*10;//将坐标都换成整型
		if(x1==x2)//如果这条线是一条竖直的线
		{
			if(x1%10!=0){//如果此时的直线l:x=c,c不是整数,那么这条线上显然没有整点
				printf("0\n");
				continue;
			}
			y2=floor(max(Y1,Y2));
			y1=ceil(min(Y1,Y2));
			printf("%lld\n",y2-y1+1);
			continue;
		}
		if(y1==y2)//如果这条线是一条水平的线
		{
			if(y1%10!=0){//如果此时的直线l:y=c,c不是整数,那么这条线上显然也没有整点
				printf("0\n");
				continue;
			}
			x2=floor(max(X1,X2));
			x1=ceil(min(X1,X2));
			printf("%lld\n",x2-x1+1);
			continue;
		}
		ll a=(y2-y1)*10,b=(x1-x2)*10,c=x1*y2-x2*y1;//计算出l:ax+by=c
		ll x,y,d;
		if(X2<X1) swap(X2,X1);//确保x2>x1
		x1=ceil(X1),x2=floor(X2);
		if(x1>x2){//如果一条线的斜率过大,使得x1,x2有m<x1<x2<m+1 (m为整数),那么显然这个范围内没有整点
			printf("0\n");
			continue;
		}
		ll k=0;
		exgcd(a,b,d,x,y);//得到满足ax+by=gcd(a,b)的(x0,y0)
		if (c%d==0)//如果c是gcd(a,b)的整数倍,即c = k * gcd(a,b),那么显然点( k * x0 , k * y0 )是ax+by=c上的一个整点
		{
			a/=d,b/=d;
			x*=c/d,y*=c/d;
			if(b<0) b=-b;
			x=x-(x-x1)/b*b;
			while(x<x1) x+=b;
			while(x+k*b<=x2) k++;
			printf("%lld\n",k);
		}
		else printf("0\n");
	}
	return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 平面格变换器(Flat Lattice Transformer)是一种用于自然语言处理的神经网络模型,它是基于Transformer模型的改进版本。与传统的Transformer模型不同,平面格变换器使用平面格结构来表示输入和输出序列,这种结构可以更好地捕捉序列中的局部依赖关系。平面格变换器在机器翻译、文本分类、问答系统等任务中取得了很好的效果。 ### 回答2: Flat-lattice-transformer 是一种新型的序列建模技术,它是基于已有的transformer模型而进行改良升级所得到的。Flat-lattice-transformer在序列任务中具有极强的建模能力,在各种语言模型、机器翻译、文本分类等自然语言处理任务中表现优异。 Flat-lattice-transformer的主要思想是将传统的句子表示构建转换成一种扁平化的结构,从而解决了原来transformer模型中无法处理较长句子的问题。Flat-lattice-transformer将输入序列转换成一个图,将每个单词作为结点,并根据它们之间的依赖关系建立边,得到一个扁平的表示。这样做的好处是可以在不损失重要信息的前提下,缩小模型的空间复杂度,使其能够处理更长的序列。 构建这样一个扁平的图结构需要进行一系列的预处理和转换,其中最重要的是将输入的序列转换成一个有限状态自动机(Finite State Machine,FSM),然后将该自动状态转换成一个有向图。在构建图结构之后,Flat-lattice-transformer还会对其进行一定的拓扑排序和优化,以便在后续处理中更加高效地搜索图的信息。 最终的输出是一个矩阵,其中每个元素代表了一个状态下输出的结果概率,然后根据这个矩阵来计算输入序列的概率。 Flat-lattice-transformer在一些自然语言处理任务中已经取得了优异的成果,而且其对于长句建模和处理的能力更为突出,成为了自然语言处理领域中一个备受关注的技术。 ### 回答3: Flat-lattice-transformer是指一种基于transformer模型的语音识别系统。它是由研究人员提出的一种新型语音识别架构,用于解决传统语音识别系统中困扰人们已久的问题。 传统的语音识别系统通常采用深度神经网络(DNN)或循环神经网络(RNN)进行声学建模。这些模型通常使用帧级别的信息来预测每个音素的输出结果。然而,由于音素之间存在连续性和上下文依赖性,这种方法往往会导致误识别率较高。 Flat-lattice-transformer采用transformer作为声学建模器,从而利用transformer的自注意力机制学习多级别上下文信息,并能够直接预测音素序列,而无需使用基于帧的分类器。另外,该模型引入统一的flat lattice生成机制,将声学特征和语言学知识进行融合,使得模型具备更好的能力来解决上下文依赖性和连续性的问题,从而实现了更高的识别精度。 Flat-lattice-transformer还具有许多其他优点。例如,与传统的基于标注的端到端语音识别系统相比,它不需要任何语言标注信息,因此可以避免标注数据的稀缺性和昂贵的标注成本。此外,该系统还可以在训练数据较少的情况下实现较高的识别性能,这为许多实际应用提供了便利和可能性。 总的来说,Flat-lattice-transformer是一种比传统语音识别系统更优秀的语音识别架构。它的出现为语音识别领域带来了新的思路和技术,同时也为我们提供了更多解决语音识别问题的可能性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值