zoukankan      html  css  js  c++  java
  • CQOI2016 密钥破解

    洛谷传送门

    Solution:(非常言简意赅)

    首先分解出p,q 用Pollard-Rho算法

    算出r

    解ed≡1(mod r)的同余方程算出d

    用快速幂算出cdmod N 然后没啦

    Code:

     1 #include<bits/stdc++.h>
     2 #define Rg register
     3 #define go(i,a,b) for(Rg int i=a;i<=b;i++)
     4 #define ll long long
     5 using namespace std;
     6 ll rd()
     7 {
     8   ll x=0,y=1;char c=getchar();
     9   while(c<'0'||c>'9'){if(c=='-')y=-1;c=getchar();}
    10   while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+c-'0';c=getchar();}
    11   return x*y;
    12 }
    13 ll e,n,c,p,d,g,r;
    14 ll mul(ll x,ll y,ll z)
    15 {
    16   ll sm=0;
    17   while(y){if(y&1)sm=(sm+x)%z;x=(x<<1)%z;y>>=1;}
    18   return sm;
    19 }
    20 ll gcd(ll x,ll y){return y==0?x:gcd(y,x%y);}
    21 ll f(ll x){return (mul(x,x,n)+g)%n;}
    22 void Pollard()
    23 {
    24   ll a,b;g=rand()%n+1;ll t=0;
    25   while(!p)
    26   {
    27     a=b=rand()%n+1,g=rand()%n+1;
    28     while(1)
    29     {
    30       a=f(a);b=f(f(b));if(a==b)break;
    31       ll sm=gcd(abs(a-b),n);
    32       if(sm>1){p=sm;break;}
    33     }
    34   }
    35 }
    36 ll ksm(ll x,ll y)
    37 {
    38   ll ans=1;
    39   while(y)
    40   {if(y&1)ans=mul(ans,x,n);x=mul(x,x,n);y>>=1;}
    41   return ans;
    42 }
    43 ll exgcd(ll a,ll b,ll &x,ll &y)
    44 {
    45     if(!b){x=1;y=0;return a;}
    46     ll d=exgcd(b,a%b,y,x);
    47     y-=a/b*x;return d;
    48 }
    49 int main()
    50 {
    51   srand(time(0));
    52   e=rd(),n=rd(),c=rd();Pollard();
    53   r=(p-1)*(n/p-1);exgcd(e,r,d,g);
    54   while(d<0)d+=r;while(d>r)d-=r;
    55   printf("%lld %lld",d,ksm(c,d));
    56   return 0;
    57 }
    View Code
    光伴随的阴影
  • 相关阅读:
    自我介绍
    工作流
    spring框架
    关于建立内部会议讨论规范的想法
    论文第3章:移动绘图平台的架构设计
    迭代器、推导式、函数式编程学习笔记
    Python装饰器学习(九步入门)
    Inkpad绘图原理浅析
    从零开始创建一个插件
    Entity Framework的启动速度优化
  • 原文地址:https://www.cnblogs.com/forward777/p/10542213.html
Copyright © 2011-2022 走看看