hdu 2815 Mod Tree 高次方程,n不为素数


  1 Accepted   406MS   8576K   2379 B    C++/**
2 这里加了一点限制,,大体还是一样的,,
3
4 **/
5 #include <iostream>
6 #include <cstdio>
7 #include <cmath>
8 #include <cstring>
9 #include <algorithm>
10 using namespace std;
11 long long a,b,n;
12 const int maxn = 499991;
13 bool Hash[maxn];
14 long long val[maxn];
15 long long idx[maxn];
16
17 long long gcd(long long a,long long b){
18 if(b==0)
19 return a;
20 return gcd(b,a%b);
21 }
22
23 void ex_gcd(long long a,long long b,long long &x,long long &y){
24 if(b==0){
25 x=1;
26 y=0;
27 return ;
28 }
29 ex_gcd(b,a%b,x,y);
30 long long tmp= x-(a/b)*y;
31 x = y;
32 y = tmp;
33 return ;
34 }
35
36 void Insert(long long id,long long num){
37 long long k = num%maxn;
38 while(Hash[k]&&val[k]!=num){
39 k++;
40 if(k==maxn) k = k-maxn;
41 }
42 if(!Hash[k]){
43 Hash[k] = true;
44 val[k] = num;
45 idx[k] = id;
46 }
47 return;
48 }
49
50 long long found(long long num){
51 long long k = num%maxn;
52 while(Hash[k]&&val[k]!=num){
53 k++;
54 if(k==maxn) k-=maxn;
55 }
56 if(Hash[k]){
57 return idx[k];
58 }
59 return -1;
60 }
61
62 long long baby_step(long long a,long long b,long long n){
63 long long temp =1;
64 long long i;
65 for(i=0;i<=100;i++){
66 if(temp==b%n) return i;
67 temp = temp*a%n;
68 }
69 long long tmp,d =1,cnt=0;
70 memset(Hash,false,sizeof(Hash));
71 memset(val,-1,sizeof(val));
72 memset(idx,-1,sizeof(idx));
73
74 while((tmp=gcd(a,n))!=1){
75 if(b%tmp)
76 return -1;
77 cnt++;
78 n = n/tmp;
79 b = b/tmp;
80 d =d*a/tmp%n;
81 }
82 long long cur =1;
83 long long m = ceil(sqrt(n+0.5));
84 for(i=0;i<m;i++){
85 Insert(i,cur);
86 cur = cur*a%n;
87 }
88 long long x,y;
89 for(i=0;i<m;i++){
90 ex_gcd(d,n,x,y);
91 x = x*b%n;
92 x = (x%n+n)%n;
93 long long k = found(x);
94 if(k!=-1)
95 return i*m+k+cnt;
96 d = d*cur%n;
97 }
98 return -1;
99 }
100
101 int main()
102 {
103 while(scanf("%I64d%I64d%I64d",&a,&n,&b)==3){
104 if(b>=n){
105 printf("Orz,I can’t find D!\n");
106 continue;
107 }
108 if(n==1){
109 printf("0\n");
110 continue;
111 }
112 long long res = baby_step(a,b,n);
113 if(res==-1){
114 printf("Orz,I can’t find D!\n");
115 }else{
116 printf("%I64d\n",res);
117 }
118 }
119 return 0;
120 }

hdu 2815 Mod Tree 高次方程,n不为素数

时间: 2024-08-01 16:54:31

hdu 2815 Mod Tree 高次方程,n不为素数的相关文章

HDU 2815 Mod Tree 离散对数 扩展Baby Step Giant Step算法

链接:http://acm.hdu.edu.cn/showproblem.php?pid=2815 题意: 思路:与上题不同,这道题不要求m是素数,是利用扩展Baby Step Giant Step算法求离散对数. 以下转载自:AekdyCoin [扩展Baby Step Giant Step] [问题模型] 求解 A^x = B (mod C) 中 0 <= x < C 的解,C 无限制(当然大小有限制--) [写在前面] 这个问题比较麻烦,目前网络上流传许多版本的做法,不过大部分已近被证明

HDU 2815 Mod Tree (扩展 Baby Step Giant Step )

Mod Tree Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 96 Accepted Submission(s): 38   Problem Description   The picture indicates a tree, every node has 2 children.  The depth of the nodes whos

hdu 2815 Mod Tree (exBSGS)

http://acm.hdu.edu.cn/showproblem.php?pid=2815 //解 K^D ≡ N mod P #include<map> #include<cmath> #include<cstdio> #include<iostream> using namespace std; map<int,int>mp; typedef long long LL; void read(int &x) { x=0; char c

离散对数二连 poj 2417 Discrete Logging &amp; HDU 2815 Mod Tree

题目就不贴了.都是一样的套路求解a^x % c = b的最小x 注意HDU的题目很坑,有b比c大和题目中输出信息为全角引号的坑 下面贴的是HDU的版本,poj的改一下a,b,c顺序和输出就好 #include <iostream> #include <cstring> #include <algorithm> #include <cmath> using namespace std; typedef long long LL; #define MOD 999

HDU 2815 Mod Tree

Problem Description   The picture indicates a tree, every node has 2 children.  The depth of the nodes whose color is blue is 3; the depth of the node whose color is pink is 0.  Now out problem is so easy, give you a tree that every nodes have K chil

hdu 5379 Mahjong tree(树形dp)

题目链接:hdu 5379 Mahjong tree 树形dp,每个节点最多有2个子节点为一棵节点数大于1的子树的根节点,而且要么后代的节点值都大于,要么都小于本身(所以tson不为0是,要乘2).对于K个单一节点的子节点,种类数即为全排K!.当一个节点没有兄弟节点时,以这个节点为根结点的子树,根可以选择最大或者最小. #pragma comment(linker, "/STACK:102400000,102400000") #include <cstdio> #inclu

hdu 4601 Letter Tree 2013多校1-2

不容易啊..一个小错误让我wa死了,找了一个晚上,怎么都找不到 最后是对拍代码找到的错误,发现当步数比较小的时候答案就是对的,比较大的时候就不对了 想到一定是什么地方越界了... power[i] = (i64)(power[i - 1] * 26) % mod; 就是这行... 改成  power[i] = ((i64)power[i - 1] * 26) % mod; 就过了... 这道题总的来说就是非常综合,什么方面都涉及一点,核心部分还是把树转化成序列之后二分边界+RMQ,用dfn来确定

HDU 3333 Turing Tree (离散化+离线处理+树状数组)

Problem Description After inventing Turing Tree, 3xian always felt boring when solving problems about intervals, because Turing Tree could easily have the solution. As well, wily 3xian made lots of new problems about intervals. So, today, this sick t

Hdu 5379 Mahjong tree (dfs + 组合数)

题目链接: Hdu 5379 Mahjong tree 题目描述: 给出一个有n个节点的树,以节点1为根节点.问在满足兄弟节点连续 以及 子树包含节点连续 的条件下,有多少种编号方案给树上的n个点编号? 解题思路: 对于一个节点来讲,非叶子儿子节点最多有两个才能满足要求,否则满足子树节点连续的话就无法满足兄弟节点连续.然后有dfs计算每棵子树的贡献值,每棵子树的子节点可以分为叶子节点X和非叶子节点Y,叶子节点可以分配到一组连续的编号,非叶子节点只能分配到兄弟节点中最大或者最小编号两种情况,叶子节