POJ3243 Clever Y【高次同余方程】

2024-06-15 05:18

本文主要是介绍POJ3243 Clever Y【高次同余方程】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目链接:

http://poj.org/problem?id=3243


题目大意:

已知公式A^x mod C= B,以及A、C、B的值,求解x的值为多少。


思路:

典型的求解方程A^x = B(mod C),直接模板解决。


AC代码:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath>
#define LL __int64
using namespace std;
const int MAXN = 65535;struct HASH
{int a;int b;int next;
}Hash[MAXN*2];int flag[MAXN+66];
int top,idx;void ins(int a,int b)
{int k = b & MAXN;if(flag[k] != idx){flag[k] = idx;Hash[k].next = -1;Hash[k].a = a;Hash[k].b = b;return;}while(Hash[k].next != -1){if(Hash[k].b == b)return;k = Hash[k].next;}Hash[k].next = ++top;Hash[top].next = -1;Hash[top].a = a;Hash[top].b = b;
}int Find(int b)
{int k = b & MAXN;if(flag[k] != idx)return -1;while(k != -1){if(Hash[k].b == b)return Hash[k].a;k = Hash[k].next;}return -1;
}int GCD(int a,int b)
{if(b == 0)return a;return GCD(b,a%b);
}int ExGCD(int a,int b,int &x,int &y)
{int temp,ret;if(!b){x = 1;y = 0;return a;}ret = ExGCD(b,a%b,x,y);temp = x;x = y;y = temp - a/b*y;return ret;
}int Inval(int a,int b,int n)
{int x,y,e;ExGCD(a,n,x,y);e = (LL)x*b%n;return e < 0 ? e + n : e;
}int PowMod(LL a,int b,int c)
{LL ret = 1%c;a %= c;while(b){if(b&1)ret = ret*a%c;a = a*a%c;b >>= 1;}return ret;
}int BabyStep(int A,int B,int C)
{top = MAXN;++idx;LL buf = 1%C,D = buf,K;int d = 0,temp,i;for(i = 0; i <= 100; buf = buf*A%C,++i){if(buf == B)return i;}while((temp = GCD(A,C)) != 1){if(B % temp)return -1;++d;C /= temp;B /= temp;D = D*A/temp%C;}int M = (int)ceil(sqrt((double)C));for(buf = 1%C,i = 0; i <= M; buf = buf*A%C,++i)ins(i,buf);for(i = 0,K = PowMod((LL)A,M,C); i <= M; D = D*K%C,++i){temp = Inval((int)D,B,C);int w;if(temp >= 0 && (w = Find(temp)) != -1)return i * M + w + d;}return -1;
}int main()
{int A,B,C;while(~scanf("%d%d%d",&A,&C,&B) && (A||B||C)){B %= C;int temp = BabyStep(A,B,C);if(temp < 0)printf("No Solution\n");elseprintf("%d\n",temp);}return 0;
}


这篇关于POJ3243 Clever Y【高次同余方程】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1062521

相关文章

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言

OpenGL/GLUT实践:流体模拟——数值解法求解Navier-Stokes方程模拟二维流体(电子科技大学信软图形与动画Ⅱ实验)

源码见GitHub:A-UESTCer-s-Code 文章目录 1 实现效果2 实现过程2.1 流体模拟实现2.1.1 网格结构2.1.2 数据结构2.1.3 程序结构1) 更新速度场2) 更新密度值 2.1.4 实现效果 2.2 颜色设置2.2.1 颜色绘制2.2.2 颜色交互2.2.3 实现效果 2.3 障碍设置2.3.1 障碍定义2.3.2 障碍边界条件判定2.3.3 障碍实现2.3.

R语言结构方程模型分析与实践技术应用

结构方程模型(Sructural Equation Model)是一种建立、估计和检验研究系统中多变量间因果关系的模型方法,它可以替代多元回归、因子分析、协方差分析等方法,利用图形化模型方式清晰展示研究系统中变量间的因果网络关系,是近年来地学、生态、进化、环境、医学、社会、经济领域中应用十分广泛的统计方法。然而,自Wright在1920年美国科学院院刊(PNAS)提出第一个通径/路径(Pa

解决ax+by=c,不定方程(扩展欧几里得)

首先有几个定理我们需要知道,在这里我也会一一证明。 —————————————————————————————————————— 定理1:gcd(a,b)==gcd(b,a%b);这个是欧几里得提出并证明的。 (%是取余的意思,在数学中 可用mod表示); 以下是证明过程 —————————————————————————————————————— 令a = k * b + r; (k

Python案例 | 使用四阶龙格-库塔法计算Burgers方程

使用四阶龙格-库塔法计算Burgers方程 引言求解过程完整代码 引言 Burgers方程产生于应用数学的各个领域,包括流体力学、非线性声学、气体动力学和交通流。它是一个基本的偏微分方程,可以通过删除压力梯度项从速度场的Navier-Stokes方程导出。对于黏度系数较小的情况( ν = 0.01 / π \nu = 0.01/ \pi ν=0.01/π),Burgers方程会

强化学习深入学习(一):价值函数和贝尔曼方程

文章目录 0. 引言1. 回报(Return)2. 价值函数(Value Function)3. 贝尔曼期望方程(Bellman Expectation Equation)4. 贝尔曼最优方程(Bellman Optimality Equation)总结 0. 引言 强化学习(Reinforcement Learning, RL)是一种机器学习方法,通过与环境的交互来学习如何

数论 - n元线性同余方程的解法

note:n元线性同余方程因其编程的特殊性,一般在acm中用的很少,这里只是出于兴趣学了一下 n元线性同余方程的概念:   形如:(a1*x1+a2*x2+....+an*xn)%m=b%m           ..................(1) 当然也有很多变形,例如:a1*x1+a2*x2+...+an*xn+m*x(n+1)=b.这两个都是等价的。 判断是否有解:

Ferrari求解四次方程

参考: 1) https://proofwiki.org/wiki/Ferrari’s_Method#google_vignette 2)https://blog.csdn.net/qq_25777815/article/details/85206702

[3.2] 机器人连杆变换和运动学方程

本节首先推导相邻两连杆坐标系之间的变换矩阵,然后将这些变换矩阵依次相乘,得到操作臂的运动学方程。该方程表示末端连杆相对于基座的位姿关系,是各关节变量的函数。 连杆坐标系{i}与{i-1}通过四个参数、、、联系起来,因此坐标系{i}相对于{i-1} 的齐次变换矩阵T,通常也是连

7-8 h0056. 不定方程求解

//23计科的同学们,能不能先学一下思路再自己写一下代码? 给定正整数a,b,c。求不定方程 ax+by=c 关于未知数x和y的所有非负整数解组数。 输入格式: 多行,每行包含三个正整数a,b,c,两个整数之间用单个空格隔开。每个数均不大于1000。 输出格式: 多行,每行一个整数,即不定方程的非负整数解组数。 输入样例: 2 3 18 输出样例: 4 #include<bi