poj2115

题目不难,设计到的知识点也不多。具体为扩展欧几里德定理求解模线性方程。题意为给定一个循环:

for (variable = A; variable != B; variable += C)

  statement;

A、B、C为K bit无符号数(即0<=A、B、C<2^k)。要我们判段该循环内的statement可以执行多少次,若为死循环。则输出FOREVER。

若不为死循环。且假定可以循环X次。则可以推出: (A+X*C)%(2^K)=B也即X*C=(B-A)%(2^K)。此式子为模线性方程。若方程有解则求出该方程的最小整数。否则说明为死循环,输出FOREVER。那么关键点就是求解模线性方程了。

令a=C;

    b=B-A;

    n=2^K;

模线性方程如下:ax=b(mod)n;

下面介绍利用扩展欧几里德算法求解ax=b(mod)n即方程:ax+ny=b;

首先:ax=b(mod)n;若有解则说明GCD(a,n)|b,即b%GCD(a,n)==0.解个数为GCD(a,n),否则无解。若存在解,则令d=GCD(a,n),利用扩展欧几里德算法求解ax+ny=d的一个解x0,y0.

满足ax0+ny0=d, 两边同时乘以b/d,则为a*b/d*x0+n*b/d*y0=b; 则模线性方程ax=b(mod)n的最小解为:x0'=x=(b/d)*x0,y0'=(b/d)*y0。d个解如下:

xi= x0'+ i* (n/ d ){i= 0... d-1}。

设ans=x0‘*(b/d),s=n/d;

方程ax≡b (mod n)的最小整数解为:(ans%s+s)%s;

那么关键点就是扩展欧几里德算法的编写了:下面是其递归模板(理解为主),在我的博客中有介绍:

01.int exgcd(int a,int b,int &x,int &y){  
02.    if(b==0){  
03.        x=1;  
04.        y=0;  
05.        return a;  
06.    }  
07.    int r=exgcd(b,a%b,x,y);  
08.    int t=y;  
09.    y=x-(a/b)*y;  
10.    x=t;  
11.    return r;  
12.}  

如下为其非递归形式:

01.int exgcd(int a,int b,int &x,int &y){  
02.    if(b==0){  
03.        x=1;  
04.        y=0;  
05.        return a;  
06.    }  
07.    int q,r;  
08.    int x1=0,y1=1;  
09.    int x2=1,y2=0;  
10.    while(b>0){  
11.       q=a/b;  
12.       r=a-q*b;  
13.       x=x2-q*x1;  
14.       y=y2-q*y1;  
15.       a=b;  
16.       b=r;  
17.       x2=x1;  
18.       x1=x;  
19.       y2=y1;  
20.       y1=y;  
21.    }  
22.    x=x2,y=y2;  
23.    return a;  
24.}  

还需要注意的就是再求最小整数解时。由于最小解可能小于0,故要对其先求模,然后再取模。另外表示2^k,若为int,则直接为1<<k(1左移k位); 若为LL或__int64则要强制转换如下:(LL)1<<k, (__int64)1<<k.否则可能产生异想不到的结果。 

下面是代码:132K+0MS

#include <stdio.h>
#include <stdlib.h>
__int64  A,B,C;
int k;
__int64 exgcd(__int64 a,__int64 b,__int64 &x,__int64 &y){ // 扩展欧几里德算法求解方程ax+ny=b的最小解x0,y0
	if(b==0){
		x=1,y=0;
		return a;
	}
	__int64 rs=exgcd(b,a%b,x,y);
	__int64 temp=x;
	x=y;
	y=temp-a/b*y;
	return rs;
}

int main(){
	while(scanf("%I64d%I64d%I64d%d",&A,&B,&C,&k)){
		if(A==0 && B==0 && C==0 && k==0)
			break;
		__int64 n=(__int64)1<<k; // 2^k次方
		__int64 a=C,b=B-A,x,y,d;
		d=exgcd(a,n,x,y);  
		if(b%d!=0) // 若方程无解
			printf("FOREVER\n");
		else{ // 否则输出最小整数解
			__int64 s=n/d;
			x=((x%n)*(b/d))%n;
			printf("%I64d\n",(x%s+s)%s);
		}
	}
	return 0;
}
		


 

深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和式识别。深度学习型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值