51nod1039 x^3 mod p
第1行:一个数T,表示后面用作输入测试的数的数量。(1 <= T <= 1000)
第2 - T + 1行:每行两个数P A,中间用空格隔开。(1 <= A < P <= 10^9, P为质数)
共T行,每行包括符合条件的X,且0 <= X <= P,如果有多个,按照升序排列,中间用空格隔开。如果没有符合条件的X,输出:No Solution
首先求P的原根g
bsgs求出b满足gb=A (mod P)
所以X3=gb+k(P-1)=A (mod P)
X=g(b+k(P-1))/3 ( (b+k(P-1))|3 , k∈{0,1,2} )
(别问我为什么不是c++,以上非正解是卡过去的
import java.util.*;
public class Main{
static final int N=32007;
static boolean np[]=new boolean[N+4];
static int ps[]=new int[N/5],pp=0;
static final int P=65536,A=2939;
static int xs[]=new int[P],ys[]=new int[P],ts[]=new int[P],now=1;
static int as[]=new int[16],ap=0;
static int pow(int x,int n,int p){
int v=1;
for(;n!=0;n>>=1){
if((n&1)!=0)v=(int)((long)v*x%p);
x=(int)((long)x*x%p);
}
return v;
}
static int inv(int x,int p){
return pow(x,p-2,p);
}
static void get_primes(){
for(int i=2;i<=N;i++){
if(!np[i])ps[pp++]=i;
for(int j=0;j<pp&&i*ps[j]<=N;j++){
np[i*ps[j]]=true;
if(i%ps[j]==0)break;
}
}
}
static int root(int x){
int fs[]=new int[32],fp=0,x0=x-1;
for(int i=0,w;i<pp;i++){
w=ps[i];
if(w*w>x0)break;
if(x0%w==0){
fs[fp++]=w;
do x0/=w;while(x0%w==0);
}
}
if(x0!=1)fs[fp++]=x0;
x0=x-1;
for(int i=2;i<x;i++){
boolean is=true;
for(int j=0;j<fp;j++)if(pow(i,x0/fs[j],x)==1){
is=false;
break;
}
if(is)return i;
}
return -1;
}
static void clear(){
++now;
}
static void ins(int x,int y){
int w=x&65535;
while(ts[w]==now)w=w+A&65535;
xs[w]=x;
ys[w]=y;
ts[w]=now;
}
static int find(int x){
int w=x&65535;
while(ts[w]==now){
if(xs[w]==x)return ys[w];
w=w+A&65535;
}
return -1;
}
static int bsgs(int a,int b,int p){
int r=(int)(Math.sqrt(p)*0.7),_a=inv(a,p);
clear();
for(int i=0,x=b;i<r;i++,x=(int)((long)x*_a%p))ins(x,i);
for(int i=r,_x=pow(a,r,p),x=_x;;i+=r,x=(int)((long)x*_x%p)){
int v=find(x);
if(v!=-1)return i+v;
}
}
public static void main(String[] args){
get_primes();
Scanner sc=new Scanner(System.in);
int T,p,a;
for(T=sc.nextInt();T>0;T--){
p=sc.nextInt();a=sc.nextInt();
if(p<400){
ap=0;
for(int i=1;i<p;i++)if(i*i*i%p==a)as[ap++]=i;
}else{
int g=root(p);
int m=bsgs(g,a,p);
ap=0;
for(int i=0;i<3;i++){
long v=m+i*(long)(p-1);
if(v%3==0)as[ap++]=pow(g,(int)(v/3),p);
}
for(int aa=0;aa<ap;aa++)
for(int b=1;b<ap;b++)if(as[b-1]>as[b]){
int x=as[b];
as[b]=as[b-1];
as[b-1]=x;
}
}
if(ap>0){
for(int i=0;i<ap-1;i++)System.out.print(as[i]+" ");
System.out.println(as[ap-1]+"");
}else System.out.println("No Solution");
}
}
}
51nod1039 x^3 mod p的更多相关文章
- 51Nod1039 N^3 Mod P 数论 原根 BSGS
原文链接https://www.cnblogs.com/zhouzhendong/p/51Nod1039.html 题目传送门 - 51Nod1039 题意 题解 这题我用求高次剩余的做法,要卡常数. ...
- 函数mod(a,m)
Matlab中的函数mod(a,m)的作用: 取余数 例如: mod(25,5)=0; mod(25,10)=5; 仅此.
- ORACLE 数据库 MOD 函数用法
1.求2和1的余数. Select mod(2,1) from dual: 2能被1整除所以余数为0. 2.MOD(x,y)返回X除以Y的余数.如果Y是0,则返回X的值. Select mod(2,0 ...
- 黑科技项目:英雄无敌III Mod <<Fallen Angel>>介绍
英雄无敌三简介(Heroes of Might and Magic III) 英3是1999年由New World Computing在Windows平台上开发的回合制策略魔幻游戏,其出版商是3DO. ...
- [日常训练]mod
Description 给定$p_1,p_2,-,p_n,b_1,b_2,...,b_m$, 求满足$x\;mod\;p_1\;\equiv\;a_1,x\;mod\;p_2\;\equiv\;a_2 ...
- Apache Mod/Filter Development
catalog . 引言 . windows下开发apache模块 . mod进阶: 接收客户端数据的 echo 模块 . mod进阶: 可配置的 echo 模块 . mod进阶: 过滤器 0. 引言 ...
- FZU 1752 A^B mod C(快速加、快速幂)
题目链接: 传送门 A^B mod C Time Limit: 1000MS Memory Limit: 65536K 思路 快速加和快速幂同时运用,在快速加的时候由于取模耗费不少时间TLE了 ...
- HDOJ 4389 X mod f(x)
数位DP........ X mod f(x) Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/ ...
- hdu.1104.Remainder(mod && ‘%’ 的区别 && 数论(k*m))
Remainder Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total ...
随机推荐
- Bean实例化(Spring源码阅读)-我们到底能走多远系列(33)
我们到底能走多远系列(33) 扯淡: 各位: 命运就算颠沛流离 命运就算曲折离奇 命运就算恐吓着你做人没趣味 别流泪 心酸 更不应舍弃 ... 主题: Spring源码阅读还在继 ...
- 解决github push错误The requested URL returned error: 403 Forbidden while accessing
来源:http://blog.csdn.net/happyteafriends/article/details/11554043 github push错误: git push error: The ...
- iOS7中如何去除UINavigationbar下边的那条黑线
做项目过程中遇到要去掉导航栏下面的一条黑线,从网上找到的一个方法 默认UINavigationbar样式 准备用于替换的背景 替换后的效果 if ([self.navigationController ...
- 书评<<剑指offer 名企面试官精讲典型编程题>>
前前后后阅读了一周, 感慨很多, 面试考察的是一个人的综合能力, 这一点从面试官的角度去解读, 确实对面试的理解更立体. *) 具体考察的点1) 扎实的基础2) 高质量的代码3) 清晰的思路4) ...
- 装载:深入理解拉格朗日乘子法(Lagrange Multiplier) 和KKT条件
在求取有约束条件的优化问题时,拉格朗日乘子法(Lagrange Multiplier) 和KKT条件是非常重要的两个求取方法,对于等式约束的优化问题,可以应用拉格朗日乘子法去求取最优值:如果含有不等式 ...
- char类型与Unicode的编码
Java的char型是非常独特的,占用两个字节,因为Java中char型采用了Unicode编码. 要理解这个问题,我们必须要理解什么是Unicode. 世界上存在着多种编码方式,同一个二进制数字可以 ...
- matlab演奏最炫民族风的代码注释
用Matlab来放音乐,和用单片机加蜂鸣器放音乐的原理都差不多,就是把连续的声音信号事先转换成用数字信号,然后用扬声器按照一定的节奏放出来.换句话说,演唱者是把声音经过麦克风转换成电信号,录音设备对这 ...
- Spring中@Transactional用法深度分析
引言: 在Spring中@Transactional提供一种控制事务管理的快捷手段,但是很多人都只是@Transactional简单使用,并未深入了解,其各个配置项的使用方法,本文将深入讲解各个配置项 ...
- Android 客户端和服务器 json交互
http://www.cnblogs.com/jyan/articles/2544974.html 1.JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式. ...
- 最长不下降子序列的O(n^2)算法和O(nlogn)算法
一.简单的O(n^2)的算法 很容易想到用动态规划做.设lis[]用于保存第1~i元素元素中最长不下降序列的长度,则lis[i]=max(lis[j])+1,且num[i]>num[j],i&g ...