51nod1039 x^3 mod p

X*X*X mod P = A,其中P为质数。给出P和A,求<=P的所有X。

Input

第1行:一个数T,表示后面用作输入测试的数的数量。(1 <= T <= 1000)
第2 - T + 1行:每行两个数P A,中间用空格隔开。(1 <= A < P <= 10^9, P为质数)

Output

共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");
        }
    }
}
时间: 2024-08-03 21:08:51

51nod1039 x^3 mod p的相关文章

51Nod1039 N^3 Mod P 数论 原根 BSGS

原文链接https://www.cnblogs.com/zhouzhendong/p/51Nod1039.html 题目传送门 - 51Nod1039 题意 题解 这题我这个做法要卡常数. 不好意思我只是来存代码的. 代码 #include <bits/stdc++.h> using namespace std; const int N=100005; int T,A,B,P; int Fac_p[N],Fac_tot,g; int prime[N],vis[N],pcnt=0; void G

能蜜履拖栖cn0ih1010n15

听着天梦冰蚕的讲述,霍雨浩早已忘记了恐惧,义愤填膺的道:"它们太可恶了,怎么能这样,居然囚禁了你近万年之久."巫风右腿闪电般弹起,直奔倒下的霍雨浩踢去,她这一下速度极快.眼看就要踢中霍雨浩的胸膛了.先前天梦冰蚕散发出的强大精神力曾经令他们暂时失去思索的能力,不过因为他们与天梦冰蚕之间的对比相差太大所以并未察觉.但此时近在咫尺的霍雨浩就不同了,那份由眼眸散发出的精神波动令两人都是大吃一惊.磕头认错虽然不会伤残身体,但毫无疑问,无论输赢如何,这两个小团体都是结下大仇了.双方都有武魂系两名核

赜稳蔷擞苏a6del17necnkycg3k4

徐三石的作用可以说是完美展现,发动玄冥震之后,他根本没有停顿,身体一横,就闪了出来,玄冥置换光芒再现.史莱克战队这边,戴钥衡已经横跨一步迈了出来.只要玄冥置换再次成功,那么,史莱克学院这第二位魂帝也将被置换过去.一年多前,他独自一人离开公爵府来到星斗大森林,那时怀着不成功.则成仁的想法.如果不能获取一个何时的魂环,可能就会死在星斗大森林中,成为这里植物的养分.那时候的他,心中除了决绝就是对报仇的渴望.久久公主眼神平淡的看了一眼光罩外的冰雾,嘴角微微上翘,在她身前还有一名魂师.却始终没有加入战斗.

羡崖孪廖俗qpcrvfn725y6bm

"当我想到唐门的时候,我惊讶的发现,实际上,我所有的能力都可以和唐门有关.我的灵眸武魂,本身和紫极魔瞳就有着众多关系,正是通过紫极魔瞳,才让我拥有了灵魂冲击这样的精神系能力.反过来说,我的灵眸武魂在精神控制方面的造诣也同样能够帮助我来施展各种唐门绝学,这其中就包括唐门暗器.而冰碧帝皇蝎武魂就更不用说了,冰系魂技与唐门的各种擒拿.步法有效的结合在一起,就如王冬刚才所说的那样,必定能够令我的实战能力大大提升."第十章 初涉魂导器(三)此时,众人的目光都集中在霍雨浩身上.就连玄老也不例外.大

HDU 4389 X mod f(x) (数位DP)

题目链接  HDU4389 题意  给出T个区间[L, R],统计L到R中有多少个满足条件的数. 限制条件为该数能被这个数的各位数字之和整除. 数据范围$1 <= L <= R <= 10^{9}$ 考虑数位DP 注意到f(x)最大为81,所以对1-81每一个和做一遍数位DP即可. f[pos][mod][sum][x] 表示当前处理到第pos位,当前的数位和对x取模的结果,当前的数位和,以及当前正在求的x = f(x) #include <bits/stdc++.h> us

东北育才 DAY2组合数取mod (comb)

组合数取模(comb) [问题描述] 计算C(m,n)mod 9901的值 [输入格式] 从文件comb.in中输入数据. 输入的第一行包含两个整数,m和n [输出格式] 输出到文件comb.out中. 输出一行,一个整数 [样例输入] 2 1 [样例输出] 2 [数据规模与约定] 对于 20%的数据,n<=m<=20 对于 40%的数据,n<=m<=2000 对于 100%的数据,n<=m<=20000 这道题描述很清楚,有很多种做法,第一题还是挺水的,而且很多网站上

HACK入别人的游戏制作做MOD的几种技巧

要让某个游戏(程序)加载我们的MOD,目前有想到的有三种方式: 静态注入:静态注入,即我们HACK入游戏的某个dll,然后修改里面的代码,让程序在运行后加载我们的ModDll,比如U3D的游戏可以直接修改Assembly-CSharp.dll,找到Main脚本然后让他加载我们的东西 动态注入:在游戏运行时,可以通过各种工具(例如EasyHook)Hook到游戏进程,然后强行注入代码启动我们的ModDll,这种方式需要在游戏运行后再手动执行外挂程序Hook,例如各种“游戏XX项修改器” DLL劫持

[2016-05-09][51nod][1008 N的阶乘 mod P]

时间:2016-05-09 21:21:54 星期一 题目编号:[2016-05-09][51nod][1008 N的阶乘 mod P] 题目大意:输入N和P(P为质数),求N! Mod P = ? (Mod 就是求模 %) 分析:直接算- #include<stdio.h> using namespace std; typedef long long ll; int main(){ ll n,p,ans = 1; scanf("%lld%lld",&n,&

sdutoj 2605 A^X mod P

http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2605 A^X mod P Time Limit: 5000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 It's easy for ACMer to calculate A^X mod P. Now given seven integers n, A, K, a, b, m, P, and a function