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 ...
随机推荐
- Linux系统下查看硬件信息命令大全
导读 有许多命令可以用来查看 Linux 系统上的硬件信息.有些命令只能够打印出像 CPU 和内存这一特定的硬件组件信息,另外一些命令可以查看多种硬件组件的信息. 这个教程可以带大家快速了解一下查看各 ...
- leetcode 100 Same Tree ----- java
Given two binary trees, write a function to check if they are equal or not. Two binary trees are con ...
- spark新能优化之reduceBykey和groupBykey的使用
val counts = pairs.reduceByKey(_ + _) val counts = pairs.groupByKey().map(wordCounts => (wordCoun ...
- java多线程:并发包中ConcurrentHashMap和jdk的HashMap的对比
一:HashMap--->底层存储的是Entry<K,V>[]数组--->Entry<K,V>的结构是一个单向的链表static class Entry<K, ...
- Android Studio 使用教程
http://www.tuicool.com/articles/amMvM3B 用 Android Studio 开发安卓 APP-使用篇 http://ask.android-studio.org/ ...
- svn常见错误总结
1. svn: Server sent unexpected return value (500 Internal Server Error) in response to OPTIONS reque ...
- C#配置升级
void ConvertProject() { List<BaseProjectConverter> convertors = new List<BaseProjectConvert ...
- 开源App之MyHearts(二)
前言 小弟技术有限,有的地方也是自己摸索出来的,可能和大神们写的好的代码没法比,但是我会努力的.要对自己说下,加油!! 此次更新 1.集成QQ登录完成 集成QQ登录网上写的介绍已经很多了,这里就不详细 ...
- Linux进程间通信-信号
1.什么是信号信号是Linux系统响应某些条件而产生的一个事件,接收到该信号的进程会执行相应的操作. 2.信号的产生1)由硬件产生,如从键盘输入Ctrl+C可以终止当前进程2)由其他进程发送,如可在s ...
- 查看jquery绑定的事件函数
作为技术狂热分子的职业本能,看到一个技术产品的功能,总会忍不住想知道它是怎么被实现的.比如我每每看到别人网站一个很炫的界面或者很酷的功能,就忍不住打开了浏览器的控制台... 好,不扯远,说说当你想看到 ...