fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. typedef long long ll;
  4.  
  5. vector<ll> v;
  6.  
  7. ll power(ll a, ll n,ll m){
  8.  
  9. if(n==0)
  10. return 1;
  11.  
  12. if(n%2==0){
  13. return power((a%m*a%m)%m,n/2,m);
  14. }
  15.  
  16. return (a%m*power((a%m*a%m)%m,n/2,m))%m;
  17.  
  18.  
  19.  
  20.  
  21.  
  22. }
  23.  
  24. ll modInverse(ll a, ll m)
  25. {
  26. ll m0 = m;
  27. ll y = 0, x = 1;
  28.  
  29. if (m == 1)
  30. return 0;
  31.  
  32. while (a > 1)
  33. {
  34.  
  35. ll q = a / m;
  36. ll t = m;
  37.  
  38.  
  39. m = a % m, a = t;
  40. t = y;
  41.  
  42.  
  43. y = x - q * y;
  44. x = t;
  45. }
  46.  
  47.  
  48. if (x < 0)
  49. x += m0;
  50.  
  51. return x;
  52. }
  53.  
  54.  
  55. int main() {
  56. int* b=new int[100010];
  57. for(int i=0;i<100010;i++){
  58. b[i]=1;
  59. }
  60. b[0]=0;
  61. b[1]=0;
  62. for(int i=2;i<1000;i++){
  63. for(int j=i*i;j<100010;j+=i){
  64. b[j]=0;
  65. }
  66. }
  67.  
  68. for(int i=0;i<100010;i++){
  69. if(b[i]==1)
  70. v.push_back(i);
  71. }
  72. srand (time(NULL));
  73. ll prime1 = v[(rand() % v.size())];
  74. ll prime2 = v[(rand() % v.size())];
  75. ll prime = prime1*prime2;
  76. ll euler =((prime1-1)*(prime2-1));
  77. ll p=v.size();
  78. ll index;
  79. while(1){
  80. index = rand() % p;
  81. if(v[index]<euler)
  82. break;
  83.  
  84. else
  85. p=index;
  86. }
  87. ll encry= v[index];
  88. ll decry =modInverse(encry, euler);
  89. cout<<decry<<endl;
  90. string s;
  91. getline(cin,s);
  92. for(int i=0;i<s.length();i++){
  93. int p =int(s[i]-'a');
  94. ll j=power(p,encry,prime);
  95. ll l=power(j,decry,prime);
  96.  
  97.  
  98. cout<<p<<" " <<j<<" "<<char(j)<<" "<<l<<endl;
  99.  
  100. }
  101.  
  102.  
  103.  
  104. }
Success #stdin #stdout 0s 4184KB
stdin
suresh
stdout
570158749
18  354177701   �   18
20  130954261      20
17  312376972   �   17
4  572039877   �   4
18  354177701   �   18
7  127640768   �   7