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 ...
随机推荐
- 听VOA还不如学这些 (转自知乎恶魔奶爸)
该专栏文章网址 http://zhuanlan.zhihu.com/aisapo/19634180 鉴于知乎无法插图片和音频,所以有了这篇教程集合,大家看这个就足够了其实 每次一学英语,材料无非就是V ...
- js 实现复制到剪切板 复制按钮兼容各大浏览器
zeroclipboard官网:https://github.com/zeroclipboard/ZeroClipboard 下载压缩包,得到两个“ZeroClipboard.js”和“ZeroCli ...
- meta标签兼容性
基本标签SEO 优化为移动设备添加 viewportWindows 8其他 禁止数字识自动别为电话号码不让android识别邮箱每 8 秒刷新一次页面移动端的头部标签和meta 基本标签 声明文档使用 ...
- (单选后,显示相对应的div)点击免费没有变化,点击收费出现输入框
<li> <label class="feiyonglabel">活动费用</label> <div class="textbo ...
- gulp 制作雪碧图
雪碧图:sprite 是把多张图片拼到一张图中,提升性能的一种做法.把合并的图片一次性加载到内存中,需要时只渲染一部分. 我们选择gulp.spritesmith插件. 使用gulp时首先要在指定的任 ...
- Spring中@Transactional用法深度分析
引言: 在Spring中@Transactional提供一种控制事务管理的快捷手段,但是很多人都只是@Transactional简单使用,并未深入了解,其各个配置项的使用方法,本文将深入讲解各个配置项 ...
- 信頼済みサイト对window.open窗体大小影响原因之一
如果某站点被添加进去之后,这个站点窗体限制被决定了,window.open里面,status bar 无效的设置不再起作用.而且,如果原来status bar被 任务栏挡住的话,这个时候它就会被显示出 ...
- linux环境进程的停止
使用 #ps auxf|grep 你想要获取的进程,如下,我想要获得的是nginx的进程号 图中黄色的便是进程号, 在此我们想kill掉主进程就要把后面有master字样的进程号kill掉 命令如下 ...
- knockoutjs foreach array绑定 表格 下拉框绑定
转载http://desert3.iteye.com/blog/1480471 knockoutjs foreach array绑定 表格 下拉框绑定 博客分类: Javascript 动态表格使 ...
- 《苹果开发之Cocoa编程》挑战2 创建一个数据源 练习
<苹果开发之Cocoa编程>第4版 P87 创建一个to-do list应用程序,在文本框中输入任务.当用户单击Add按钮时,添加字符串到一个变长队列,新任务就出现在list的末尾. 关键 ...