设为首页 加入收藏

TOP

sgu-261 Discrete Roots
2015-11-21 00:59:21 来源: 作者: 【 】 浏览:1
Tags:sgu-261 Discrete Roots

题目大意:

给你两个质数 P K(2<=P<=109,2<=K<=100000) ,还有一个数 A(0<=A ,求出方程 xK=A( mod P) 所有的整数解 x∈[0,P?1]


解题思路:

首先我们求出 P 的原根 g ,然后求出 t 使得 gt=A ( mod P) ,这个用大步小步。然后我们令 x=gw ( mod P) ,那么有 w?K=t ( mod φ(P)) ,这个用扩展欧几里得搞一发就行了。


AC代码:

#include 
   
     #include 
    
      #include 
     
       #include 
      
        #include 
       
         #include 
        
          #include
          using namespace std; long long fact[32000]={0}; long long factp=0; long long P,K,A; long long ans[1000010]={0}; long long ansp=0; map 
          
            hash; long long power(long long a,long long k,long long Mod) { long long o=1; for(;k>0;) { if(k&1) o=a*o%Mod; a=a*a%Mod; k>>=1; } return o; } long long primitive_root(long long prime) { long long G=0; memset(fact,0,sizeof(fact)); factp=0; long long tmp=prime-1; for(long long i=2;i*i<=tmp && tmp>2;i++) { if(tmp%i==0) { fact[++factp]=i; for(;tmp%i==0;) tmp/=i; } } if(tmp!=1) fact[++factp]=tmp; for(G=2;G
           
            ::iterator it; it=hash.find(cnt); if(it!=hash.end()) return k*m-it->second; cnt=cnt*mult%prime; } return -1; } long long ex_gcd(long long a,long long b,long long & x,long long & y) { if(!b) { x=1;y=0; return a; } long long nx,ny,d; d=ex_gcd(b,a%b,nx,ny); x=ny;y=nx-a/b*ny; return d; } int main() { cin>>P>>K>>A; if(A==0) printf("1\n0"); else if(P==2) cout<<1<
          
        
       
      
     
    
   
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇sgu-262 Symbol Recognition 下一篇杭电ACM1216――Assistance Requi..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: