bzoj1420bzoj1319 Discrete Root

2024-05-11 23:48
文章标签 discrete bzoj1420bzoj1319

本文主要是介绍bzoj1420bzoj1319 Discrete Root,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目链接:bzoj1420
题目大意:
已知k,a,p,求x^k=a (mod p)的所有根(根的范围[0,p-1]
Input
三个整数p,k,a。
Output
第一行一个整数,表示符合条件的x的个数。 第二行开始每行一个数,表示符合条件的x,按从小到大的顺序输出。

题解
数论
xka(modp)
设p的原根为g。(下面的I(x)就是x的指标
gI(x)x(modp) gI(a)a(modp)
则原方程变为 (gI(x))kgI(a)(modp)
k×I(x)I(a)(modϕ(p))
然后就可以用扩展欧几里德求I(x)的所有解。
代进原方程求出所有0到p-1范围里的根就好了
题目没有说,但是据discuss里的、bzoj1319和sgu里的原题来看,p应给是个质数。
a=0的情况下要特判

心好累啊WA了4次才发现是拓欧里的a/b忘了加括号让它向下取整QwQ
果然一点细节都不能有错啊

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long LL;
#define maxn 101000struct node
{LL j,x;bool operator < (const node y)const {return x<y.x;}
}aj[maxn];
LL ans[maxn],pri[maxn],cnt;
void get_pri(LL pn)
{for (LL i=2;i*i<=pn;i++)if (pn%i==0){pri[++cnt]=i;while (pn%i==0) pn/=i;}if (pn!=1) pri[++cnt]=pn;
}
void exgcd(LL a,LL b,LL &d,LL &x,LL &y)
{if (b==0){d=a;x=1;y=0;return;}LL xx,yy;exgcd(b,a%b,d,xx,yy);x=yy;y=xx-yy*(a/b);
}
LL qpow(LL x,LL t,LL mod)
{LL ret=1;while (t){if (t&1) ret=1LL*ret*x%mod;x=(1LL*x*x)%mod;t>>=1;}return ret;
}
LL twocut(LL r,LL x)
{LL l=0,ret=-1;while (l<=r){LL mid=(l+r)>>1;if (aj[mid].x==x) {ret=aj[mid].j;break;}if (aj[mid].x<x) l=mid+1;else r=mid-1;}return ret;
}
LL BSGS(LL a,LL b,LL p)//a^x=b(mod p)
{LL i,m=ceil(sqrt(p));for (i=0;i<m;i++){aj[i].j=i;aj[i].x=qpow(a,i,p)%p;}sort(aj,aj+m);LL am=qpow(qpow(a,p-2,p),m,p);LL ret=-1,num=0,k=b;aj[num]=aj[0];for (i=1;i<m;i++) if (aj[i].x!=aj[i-1].x) aj[++num]=aj[i];for (i=0;i<m;i++){LL w=twocut(num,k);if (w!=-1) {ret=w+i*m;break;}k=((LL)(k*am))%p;}return ret;
}
LL get_r(LL p)
{if (p==2) return 1;cnt=0;get_pri(p-1);LL g=2;while (g<p){bool bk=false;for (LL i=1;i<=cnt;i++)if (qpow(g,(p-1)/pri[i],p)==1) {bk=true;break;}if (!bk) break; g++;}if (g<p) return g;return 0;
}
int main()
{//freopen("a.in","r",stdin);//freopen("a.out","w",stdout);LL p,k,a,g,i;scanf("%lld%lld%lld",&p,&k,&a);if (a==0) {printf("1\n0\n");return 0;}g=get_r(p);LL Ix,Ia,yy,d;Ia=BSGS(g,a,p);//k*Ix+phi(p)*u=Iaexgcd(k,p-1,d,Ix,yy);if (Ia%d!=0) printf("0\n"); else{LL sp=(p-1)/d,tot=0;Ix*=Ia/d%sp;Ix=(Ix%sp+sp)%sp;if (Ix==0) Ix=sp;for (i=Ix;i<p;i+=sp) ans[++tot]=qpow(g,i,p);sort(ans+1,ans+1+tot);printf("%lld\n",tot);for (i=1;i<=tot;i++) printf("%lld\n",ans[i]);}return 0;
}

这篇关于bzoj1420bzoj1319 Discrete Root的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

How to user “Discrete“ object in openai-gym environments?

题意:怎样在 OpenAI Gym 环境中使用 “Discrete” 对象 问题背景: I am trying to create a Q-Learning agent for a openai-gym "Blackjack-v0" environment. I am trying to get the size of the observation space but its in

OpenAI Gym custom environment: Discrete observation space with real values

题意:OpenAI Gym 自定义环境:具有实数值的离散观测空间 问题背景: I would like to create custom openai gym environment that has discrete state space, but with float values. To be more precise, it should be a range of valu

POJ2417 Discrete Logging【高次同余方程】

题目链接: http://poj.org/problem?id=2417 题目大意: 已知整数P、B、N满足公式B^i = N(mod P),求i的值是多少。 思路: 典型的解高次同余方程A^x = B(mod C),直接套模板解决。注意输入顺序:C A B AC代码: #include<iostream>#include<algorithm>#inclu

poj Discrete Logging (Baby-step-Giant - step)

Discrete Logging 题目:      Given a prime P, 2 <= P < 231, an integer B, 2 <= B < P, and an integer N, 1 <= N < P, compute the discrete logarithm of N, base B, m

电磁仿真--Discrete Port-深入探讨

目录 1. Discrete Port 概述 2. 探究 Discrete Port 2.1 电压端口 2.2 电流端口 2.3 阻抗元件(S-参数类型) 2.3.1 Radius 3. 常用离散端口结构 3.1 离散边端口(Discrete Edge Ports) 3.2 离散面端口(Discrete Edge Ports) 1. Discrete Port 概述

[翻译] 禁用双GPU笔记本电脑的独显 Disabling discrete graphics in dual-GPU laptops

来源:https://www.tonymacx86.com/threads/guide-disabling-discrete-graphics-in-dual-gpu-laptops.163772/ Overview 概述 The purpose of this guide is to show you how to disable the discrete graphics device

POJ 2417 Discrete Logging (求解模方程a^x≡b(mod n))

本题题意很明确,要求解一个解模方程a^x≡b(mod n),这里博主采用了大步小步算法,也就是B-S-G-S算法 代码如下 #include <iostream>#include <algorithm>#include <cstdio>#include <cmath>#include <cstring>#include <cstdlib>#include <string>#inc

Poj 2417 Discrete Logging —— BSGS模板

This way 题意: 告诉你B,N,P,让你求最小的L使得 题解: BSGS模板,大致意思是将L变成ax+b的形式,定下x之后,式子就变成了这样: B b = = N B − a x ( m o d P ) B^b==NB^{-ax}(mod P) Bb==NB−ax(modP) 那么我们只需要先枚举b(0<=b<=x),将所有值都记下来,再枚举a,同时查询即可。 这道题如果将x

po2417 Discrete Logging

给出b n p 求l使得,b^l==n (mod p) 学习了一下 BSGS算法。 #include <cstdio>#include <cmath>#include <map>using namespace std;typedef long long ll;ll p,b,n;void exgcd(ll c,ll d,ll &x,ll &y){if(!d){x=1;y=0

Paper - Neural Discrete Representation Learning (VQ-VAE) 论文简读

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/133992971 问题1:训练完成之后,如何判断 VQ-VAE 的效果? 输入一张训练样本之外的图像,经过编码器,与EmbeddingTable计算最近邻的向量,再把向量输入解码器中,获得重构之后的图像,判断图像