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

相关文章

中介子方程三十

X§XFX§XuX§XWX§XuX§XdX§XrX§XαX§XuXpXuX§XαX§XrX§XdX§XuXWXπX§XWXeXyXeXbXπXpX§XNX§XqXeX§XrX§XαX§XuXpXuX§XαX§XrX§XeXqX§XNX§XpXπXbXeXyXeXWX§XπXWXuX§XdX§XrX§XαX§XuXpXuX§XαX§XrX§XdX§XuX§XWX§XuX§XFX§XEX§XyX§XE

中介子方程二十九

X§XFX§XuX§XWX§XuX§XdX§XrX§XαX§XuX§XαX§XrX§XdX§XuXWXπX§XWXeXyXeXbXπXpX§XNX§XqXeX§XrX§XαX§XuX§XαX§XrX§XeXqX§XNX§XpXπXbXeXyXeXWX§XπXWXuX§XdX§XrX§XαX§XuX§XαX§XrX§XdX§XuX§XWX§XuX§XFX§XEX§XyX§XEX§XrX§XαX§Xu

关于椭圆的方程(有Python画的动图)

关于椭圆的方程(有Python画的动图) flyfish 几何定义 椭圆是平面上所有到两个固定点(焦点)的距离之和为常数的点的集合。这两个固定点叫做焦点。 解析几何描述 设椭圆的两个焦点为 F 1 F_1 F1​ 和 F 2 F_2 F2​,焦距(两焦点之间的距离的一半)为 c c c,长轴的半长轴为 a a a,短轴的半短轴为 b b b,椭圆上任意一点到这两个焦点的距离之

关于圆的方程

关于圆的方程 flyfish 几何定义 圆是平面上所有到一个固定点(圆心)距离相等的点的集合。 解析几何描述 设圆心位于点 ( h , k ) (h, k) (h,k),半径为 r r r,那么对于圆上的任意一点 ( x , y ) (x, y) (x,y),它到圆心的距离总是等于 r r r。根据勾股定理,这个距离可以表示为: ( x − h ) 2 + ( y − k ) 2

偏微分方程算法之抛物型方程差分格式编程示例四(Richardson外推)

目录 一、研究问题 二、C++代码  三、结果分析 一、研究问题 已知其精确解为。分别取以下三种步长: ①

【数学建模】解析几何与方程模型

文章目录 解析几何与方程模型1.几何建模思想2.Numpy在线性代数中的使用3.国赛求解3.1题目3.2 问题1求解建立模型代码求解 3.3 问题2求解 4.问题答疑Q1:什么是行列式,其使用场景是什么行列式的定义行列式的性质行列式的使用场景 Q2:2023B题问题一用相似三角形求解覆盖宽度 W W W 5.学习感想6.疑问 解析几何与方程模型 写在最前,该读书笔记为参加Da

椭圆的标准方程与协方差矩阵的特征值和特征向量的关系

椭圆的标准方程与协方差矩阵的特征值和特征向量的关系 flyfish 单位圆 :单位圆表示在标准正交基下的分布。 椭圆 :通过协方差矩阵的特征向量和特征值变换得到的椭圆,表示数据在新的坐标系下的分布。 特征向量 :红色箭头表示特征向量方向,即椭圆的主要轴方向。 特征值 :红色箭头的长度表示特征值大小,即椭圆沿主要轴的伸缩程度。 import numpy as npimport ma

中介子方程二十二

X$XFX$XdXuXWXπX$XWXeXyXeXyXeXWX$XπXWXuXdX$XFX$XEXyXαXiX$XαXiXrXkXtXyX$XpXVX$XdXuXWXπX$XWXeXyXeXyXeXWX$XπXWXuXdX$XVXpX$XyXtXkXrXiXαX$XiXαXyXEX$XFX$XEXyXαXiX$XαXiXrXkXtXyX$XpXVX$XdXuXWXπX$XWXeXyXeXyXeXW

python-不定方程求解

[题目描述] 给定正整数 a,b,c。求不定方程ax+by=c 关于未知数 x 和 y 的所有非负整数解组数。输入: 一行,包含三个正整数 a,b,c,两个整数之间用单个空格隔开。每个数均不大于 1000。输出: 一个整数,即不定方程的非负整数解组数。样例输入1 2 3 18 样例输出1 4 来源/分类(难度系数:一星) 完整代码如下: # coding=utf-8 a,b,c=map(in

兰切斯特方程

兰切斯特方程又称兰彻斯特战斗理论或战斗动态理论,是应用数学方法研究敌对双方在战斗中的武器、兵力消灭过程的运筹学分支。 兰切斯特把战斗简化为两种基本情况:远距离交火和近距离集中火力杀伤。远距离交火时,一方损失率既和对方兵力成正比,也和己方兵力成正比,以微分方程表示即为 dy/dt=-a*x*y dx/dt=-b*x*y 其中x和y分别为红军和蓝军的战斗单位数量,a和b分别为红军和蓝军的平均